Access VBA: ошибка выполнения 3734 - PullRequest
0 голосов
/ 14 ноября 2008

Может ли кто-нибудь дать мне детали

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

в Access vba.

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

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

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

Ответы [ 2 ]

1 голос
/ 16 ноября 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. Поскольку мы не знаем, чего вы на самом деле пытаетесь достичь, практически невозможно дать хороший совет относительно того, что именно вы должны изменить в своем коде.

0 голосов
/ 14 ноября 2008

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

...