这是一个超级基本的问题,但我正在尝试通过一些表单值针对表单所在的 MS Access 数据库执行一个查询。我认为我不需要正式通过 ADO,但也许我做。
无论如何,我们将不胜感激。对不起,我是一个 n00b。;)
您可以使用以下 DAO 代码查询 Access DB:
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 是表单上的一个文本框。
这里以防万一您想要 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 记录集的循环。这通常是完成文本的一种非常低效的方法。例如,这个:
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 更新速度会快几个数量级(并且会导致在数据页上保持更短的读/写锁)。
这就是我最终想出的真正有效的方法。
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