Vba 对MS Access 2003执行动态SQL查询

Vba 对MS Access 2003执行动态SQL查询,vba,ms-access,Vba,Ms Access,这是一个非常基本的问题,但我正在尝试执行一个查询,该查询是通过表单所在的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 WH

这是一个非常基本的问题,但我正在尝试执行一个查询,该查询是通过表单所在的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可以获得更好的性能。在我遇到的大多数access数据库应用程序中,它实际上没有什么区别。当我看到一个很大的不同是与链接表。ADO通常表现得更好。

我接受这个答案,只是If块的功能不例外(我不这么认为)。如果不是rs.EOF,则应该是
,然后是
?我已对其进行了编辑,以包含“Not rs.EOF”和rs.movenext。如果要遍历记录集中的记录,则需要使用rs.movenext语句,假设SQL将返回多行。请保存一个集并使用CurrentDb.OpenRecordset()。不需要创建单独的数据库对象。我认为示例代码应该使用最佳实践,DAO中的CurrentDB.OpenRecordset()可以保留显式对象引用挂起。其次,作为示例代码,您可以在这里打开与当前数据库不同的数据库,因此作为示例代码,我认为它更好。我发现DAO使用Access 97格式的数据库工作得更快,而ADO使用Access 2000或更高版本的数据库工作得更快。我认为这是jet 3.5和jet 4.0之间的区别。好吧,这个问题实际上并没有说明正在执行更新。可能正在读取数据以便显示?以什么方式显示?表格?如果是这样,那么这不是最好的方法。如果在报告中,这真的不是最好的方法。对我来说,“执行查询”意味着“通过查询更新数据”,但也许我读错了OP。实际上,他们说“执行查询”:大Q=大差异。一个查询(小q)是一个SQL DML SELECT,它将预映射一个记录集。查询(大Q)是一个MS Access(不是Jet,不是ACE)对象,它可能包含任何SQL语句:SELECT/INSERT/UPDATE/DELETE SQL DML,甚至SQL DDL或SQL DCL。您可以指定是修改数据库中的数据还是读取数据以供显示吗?在我投票支持其中一个答案之前,我需要知道:)