Это вопрос супер базовый, но я пытаюсь выполнить запрос, который я создаю с помощью некоторых значений формы, в базе данных MS Access, в которой находится форма. Я не думаю, что мне нужно проходить через ADO формально, но, возможно, я .
В любом случае, некоторая помощь будет оценена. Извините за то, что я новичок. ;)





Вы можете использовать следующий код DAO для запроса базы данных Access:
Dim rs As DAO.Recordset
Dim db As Database
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Attendance WHERE ClassID = " & ClassID)
do while not rs.EOF
'do stuff
rs.movenext
loop
rs.Close
Set rs = Nothing
В моем случае ClassID - это текстовое поле в форме.
Я бы принял этот ответ, за исключением того, что блок If не работает как исключение (я не думаю). Стоит If Not rs.EOF Then?
Я отредактировал его, включив в него «not rs.EOF» и rs.movenext.
Это то, что я в итоге придумал, что действительно работает.
Dim rs As DAO.Recordset
Dim db As Database
Set db = CurrentDB
Set rs = db.OpenRecordset(SQL Statement)
While Not rs.EOF
'do stuff
Wend
rs.Close
Вам понадобится оператор rs.Movenext, если вы хотите перебирать записи в наборе записей, предполагая, что SQL вернет несколько строк.
Сохраните себе набор и используйте CurrentDb.OpenRecordset (). Нет необходимости делать отдельный объект базы данных.
Я думаю, что пример кода должен использовать лучшие практики, а CurrentDB.OpenRecordset () в DAO может оставить явную ссылку на объект зависшей. Во-вторых, в качестве образца кода это место, где вы открываете базу данных разные, чем текущую, так что в качестве образца кода я думаю, что это лучше.
Ответы, которые вам были даны и которые, похоже, вы принимаете, проходят через набор записей DAO. Как правило, это очень неэффективный метод обработки текста. Например, это:
Set db = CurrentDB()
Set rs = db.OpenRecordset("[sql]")
If rs.RecordCount > 0
rs.MoveFirst
Do While Not rs.EOF
rs.Edit
rs!Field = "New Data"
rs.Update
rs.MoveNext
Loop
End If
rs.Close
Set rs = Nothing
Set db = Nothing
будет намного менее эффективным, чем:
UPDATE MyTable SET Field = "New Data"
который можно запустить с помощью:
CurrentDb.Execute "UPDATE MyTable SET Field = 'New Data'"
Очень редко нужно перебирать набор записей в цикле, и в большинстве случаев обновление SQL будет на несколько порядков быстрее (а также приведет к удержанию гораздо более коротких блокировок чтения / записи на страницах данных).
Что ж, вопрос на самом деле не говорит о том, что обновление выполняется. Может быть, данные будут выводиться на дисплей?
Дисплей в чем? Форма? Если так, то это не лучший способ сделать это. Если в отчете это В самом деле, не лучший способ это сделать. Для меня «выполнить запрос» означает «обновить данные с помощью запроса», но, возможно, я неправильно читаю OP.
На самом деле они сказали «выполнить запрос»: большой вопрос = большая разница. Запрос (маленький q) - это SQL DML SELECT, который предварительно подразумевает набор записей. Запрос (большой Q) - это объект MS Access (не Jet, не ACE), который может содержать любой оператор SQL: SELECT / INSERT / UPDATE / DELETE SQL DML, даже SQL DDL или SQL DCL.
Вот на всякий случай, если вам нужна версия ADO:
Dim cn as new ADODB.Connection, rs as new ADODB.RecordSet
Dim sql as String
set cn = CurrentProject.Connection
sql = "my dynamic sql string"
rs.Open sql, cn ', Other options for the type of recordset to open, adoOpenStatic, etc.
While Not rs.EOF
'do things with recordset
rs.MoveNext ' Can't tell you how many times I have forgotten the MoveNext. silly.
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
DAO и ADO очень близки в использовании. Вы получаете больший контроль с DAO и немного лучшую производительность с ADO. В большинстве приложений доступа к базам данных, с которыми я сталкивался, это действительно не имеет значения. Когда я увидел большую разницу в связанных таблицах. ADO часто работает лучше.
Я обнаружил, что DAO быстрее работает с базами данных формата Access 97, а ADO - с Access 2000 и выше. Думаю, это разница между jet 3.5 и jet 4.0.
Можете ли вы указать, изменяете ли вы данные в базе данных или считываете их для отображения? Мне нужно знать, прежде чем голосовать за один из ответов :)