Доступ к VBA: ошибка выполнения 3734

Может ли кто-нибудь дать мне подробную информацию о

ошибка выполнения 3734

в аксесс вба.

Для справки я получаю его из кода в следующем потоке

Как запустить цикл запросов в доступе?

Sub plausibt_check()

Dim rs As DAO.Recordset
Dim rs2 As ADODB.Recordset
Dim db As database
Dim strsql As String
Dim tdf As TableDef




Set db = opendatabase("C:\Codebook.mdb")
Set rs = db.OpenRecordset("querycrit")

Set rs2 = CreateObject("ADODB.Recordset")
rs2.ActiveConnection = CurrentProject.Connection


For Each tdf In CurrentDb.TableDefs ' in this line the error occurs

person tksy    schedule 14.11.2008    source источник
comment
Опубликуйте код, который вызывает ошибку.   -  person xsl    schedule 14.11.2008


Ответы (2)


Кажется, вы используете ADO в текущей базе данных без сохранения. Вы должны сохранить перед запуском кода, который содержит ADO.

person Fionnuala    schedule 14.11.2008

Я не понимаю, что ты пытаешься сделать. Почему вы используете один набор записей DAO и один ADO? В этом нет никакого смысла. Если вы сохранили запросы во внешнем интерфейсе Access, то даже если ваш внутренний сервер представляет собой, скажем, SQL Server со ссылками на таблицы ODBC, в использовании ADO нет никакой пользы.

В вашем коде нет признаков цикла, поэтому, если ваш код не вызывается циклом, мне не кажется, что объяснение статьи базы знаний применимо.

Я не знаю, что вы хотите сделать, но мысль об открытии вашей базы данных один раз, а не при каждом повторении вашего цикла, должна быть довольно очевидной для любого, кто об этом думает. Если вы запускаете цикл и многократно открываете одну и ту же базу данных при каждом повторении цикла, должно быть очевидно, что операция принадлежит вне цикла.

Это было бы примерно так:

  Dim db As DAO.Database
  Dim qdf As DAO.QueryDef

  Set db = CurrentDB()

  For Each qdf in db.QueryDef
    [do whatever here]
  Next qdf

  Set qdf = Nothing
  Set db = Nothing

В этом коде вы используете MDB, открытую в данный момент в пользовательском интерфейсе, но это не имеет значения — какую бы базу данных вы ни открывали и не перебирали ее объекты, она должна открываться только один раз вне цикла.

Если вы хотите, чтобы ваш цикл находился в подпрограмме, вызываемой из вашего основного кода, передайте переменную базы данных в качестве аргумента вашей подпрограмме. Подпрограмма будет примерно такой:

  Public Sub ProcessQueries(db As DAO.Database)
    Dim qdf As DAO.QueryDef

    For Each qdf in db.QueryDef
      [do whatever here]
    Next qdf

    Set qdf = Nothing
  End Sub

И вы бы назвали это так:

  Dim db As DAO.Database

  Set db = CurrentDB()    
  Call ProcessQueries(db)    
  Set db = Nothing

Теперь, если вы настаиваете на получении исходных данных из DAO, а затем делаете что-то с ними через ADO, у вас будет цикл DAO и внутри него, а также цикл ADO. Из-за этого вам нужно определить соединение ADO вне цикла DAO, а не внутри него. Единственным исключением из этого будет случай, когда данные, которые вы извлекаете из своего цикла DAO, определяют, какую базу данных вы открываете с помощью ADO. Поскольку мы не знаем, чего вы на самом деле пытаетесь достичь, практически невозможно дать хороший совет о том, что именно вы должны изменить в своем коде.

person David-W-Fenton    schedule 16.11.2008
comment
Иногда может быть полезно использовать схемы ADO. - person Fionnuala; 16.11.2008
comment
Я не говорю, что ADO никогда не бывает полезным. Действительно, есть около 6 вещей, которые ADO может делать с Jet 4, но не может DAO (потому что MS намеренно решила оставить это, когда они отказывались от DAO в пользу ADO; теперь они изменились). Но для основных операций с записями я не вижу никакой пользы в ADO по сравнению с DAO. - person David-W-Fenton; 17.11.2008