在 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.RecordsetADODB.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 选择语句打开记录集

如何在 Outlook 2003/2007 的导航窗格(外观栏)中添加新按钮?

打开记录集 MSAccess 时出错