在 Access 2003/2007 中打开记录集
Posted
技术标签:
【中文标题】在 Access 2003/2007 中打开记录集【英文标题】:Open recordset in Access 2003/2007 【发布时间】:2011-05-17 17:50:59 【问题描述】:自从我从事 Access 代码工作以来已经有好几年了,这确实让我发疯了。
我什么都不记得了,我只想用代码打开一个记录集,但我在网上找不到任何东西,也没有任何我尝试过的代码排列。
它的短处:
Dim rsSystem As Recordset
Dim sSQL As String
sSQL = "SELECT * FROM Table"
Set rsSystem = CurrentDB.OpenRecordset(sSQL)
我到底错过了什么?
提前致谢。
【问题讨论】:
OpenRecordset 方法出现类型不匹配错误。我正在使用如上所示的代码,没有 DAO 或 ADODB 限定符。 如果您在代码窗口中,从菜单栏中打开 Tools/References 会转到 Add References 对话框。 【参考方案1】:此处的示例,用于打开“记录集”的所有排列: http://www.vbexplorer.com/VBExplorer/vb_feature/june2000/Database_Beginner_ADO_DAO.asp
最简单的方法是在当前数据库上使用 DAO。我的 VBA 有点生锈了,但是...
Dim db as DAO.Database
Dim rs as DAO.Recordset
Set db = CurrentDB
Set rs = DB.OpenRecordset("table or query name")
对于 ADO:
Dim rs As New ADODB.Recordset
rs.Open "tblPeople", CurrentProject.Connection, adOpenDynamic
【讨论】:
我不能只使用某种 CurrentDB 限定符而不必使用连接字符串,因为我想要查询的所有内容都包含在 Access 数据库中吗? 好的,我不需要添加对 DAO 的引用吗?我在 Access 2010 中找不到任何地方可以做到这一点。 试试我上面添加的 ADO。 是的,这对我有用,对我来说效果最好。现在,无论好坏,这一切都回到了我的身边。 您不一定需要 DAO 引用,但如果您没有它,则必须为变量使用对象数据类型(而不是数据库和记录集)。但是因为您使用的是 Access,所以没有 DAO 参考是很疯狂的!【参考方案2】:如果您仅声明 Recordset
而不指定它是 DAO 还是 ADO,Access 将根据您的引用顺序自行决定它是 DAO 还是 ADO:
打开一个代码窗口,转到工具 --> 参考,然后查看那里的列表。 它看起来像这样:
您会看到,在此示例中,有一个关于 DAO(“Microsoft DAO 3.6 对象库”)和 ADO(“Microsoft ActiveX 数据对象 2.5 库”)的引用。
如果您在声明 Recordset 时未指定类型,Access 会选择这些引用中的第一个(= 位于列表顶部的那个)并创建此类型的 Recordset。
所以在这个例子中,它将是一个DAO.Recordset
。
现在回到你的问题:
您声明您的 Recordset 而不指定类型。
因此,如果您的 Access 数据库中的第一个引用是 ADO,Access 将创建一个ADODB.Recordset
。
然后您使用 DAO 方法打开它,该方法需要 DAO.Recordset
,这就是您收到错误的原因。
有两种方法可以解决您的问题:
-
确保您的 Access 数据库只引用了 ADO或 DAO(但不能同时引用两者),那么您不需要指定记录集的类型。
如果您确实需要这两个引用,请始终将您的记录集声明为
DAO.Recordset
或 ADODB.Recordset
,以确保它确实是您的代码所期望的类型。
【讨论】:
感谢您的详尽解释。【参考方案3】:决定是使用 ADO 还是 DAO?这是一个 DAO(更原生于 Access/Jet)示例
dim wrk as DAO.Workspace
dim db as DAO.Database
set wrk = DBEngine.Workspaces(0)
set db = wrk.OpenDatabase(CurrentDb.Name)
Dim rsSystem as DAO.Recordset
Dim sSQL As String
sSQL = "SELECT * FROM Table"
Set rsSystem = db.OpenRecordSet(sSQL, dbOpenDynaset)
exitRoutine:
If Not (db Is Nothing) Then
db.Close
Set db = Nothing
End If
Set wrk = Nothing
不确定你想用这个记录集做什么。
【讨论】:
当我尝试添加 DAO 时,我在上下文列表中看不到它,我确定这只是我需要添加到 MDB 的参考,但对于我来说,我无法找到参考Access 2010 IDE 中的任何位置【参考方案4】:Dim rsSystem As Recordset
ADO 和 DAO 对象模型都包括 Recordset 对象。你不能互换它们。
由于您没有指定您想要的,您的可能是 ADO 记录集 ...这将导致 OpenRecordset 方法上的类型不匹配错误。
Set rsSystem = CurrentDB.OpenRecordset(sSQL)
该方法返回一个 DAO 记录集,因此首先声明 rsSytem。
Dim rsSystem As DAO.Recordset
【讨论】:
是的,谢谢。 @Robert 的上述解决方案最适合我。所有这些 Access 的东西现在都开始回到我身边了。 如果我理解您上面的评论,您决定使用 ADO,这完全是错误的。它确实反映了 MS 在 10 年前推广的内容,但他们这样做是错误的,并且已经停止推广 ADO 而不是 DAO,以便在 Access 中使用 Jet/ACE/ODBC 数据。【参考方案5】:“表”是 SQL 中的保留字。如果您必须将表命名为“table”,请将其括在方括号中:"SELECT * FROM [Table]"
。
【讨论】:
以上是关于在 Access 2003/2007 中打开记录集的主要内容,如果未能解决你的问题,请参考以下文章
Access 2010 VBA - 打开新记录集 - 打开之前意外保存的值
使用 DAO 在 Ms Access 中打开记录集时使用 With...End
Access 中的 DoCMD.OpenForm - 使用 WHERE 打开具有有限记录集的表单
Access VBA 中的运行时 3464。尝试使用 SQL 选择语句打开记录集