如何通过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的性能通常更好。