如何通过VBA对MS Access 2003执行动态SQL查询?
时间:2020-03-06 14:43:34 来源:igfitidea点击:
这是一个非常基本的问题,但是我正在尝试执行一个查询,该查询是通过一些表单值针对表单所驻留的MS Access数据库执行的。我认为我不需要正式通过ADO,但是也许我做。
无论如何,一些帮助将不胜感激。很抱歉成为n00b。 ;)
解决方案
我们可以使用以下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是表单上的文本框。
这就是我最终想到的实际可行的方法。
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
给出的答案以及我们似乎正在接受的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更新的速度将快几个数量级(并导致在数据页上保留更短的读/写锁定)。
为了以防万一,我们需要使用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的性能通常更好。