Я не понимаю, что ты пытаешься сделать. Почему вы используете один набор записей 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