【发布时间】:2010-09-13 03:10:10
【问题描述】:
这是一个超级基本的问题,但我正在尝试执行一个查询,该查询是通过一些表单值针对表单所在的 MS Access 数据库构建的。我不认为我需要正式通过 ADO,但也许我会。
无论如何,我们将不胜感激。对不起,我是一个 n00b。 ;)
【问题讨论】:
-
能否指定是修改数据库中的数据还是读取出来显示?在我投票支持其中一个答案之前,我需要知道 :)
这是一个超级基本的问题,但我正在尝试执行一个查询,该查询是通过一些表单值针对表单所在的 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 是表单上的一个文本框。
【讨论】:
If Not rs.EOF Then?
这就是我最终想出的真正有效的方法。
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
【讨论】:
这里以防万一您想要 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 更新速度会快几个数量级(并且会导致对数据持有更短的读/写锁)页)。
【讨论】: