在Access 2003/2007中打开记录集

时间:2011-05-17 17:50:59

标签: ms-access vba

自从我使用Access代码以来已经有好几年了,这让我觉得自己很疯狂。

我只是不记得任何事情,而我想做的就是在代码中打开一个记录集,我在网上找不到任何内容,或者我尝试过的代码排列。

缺点:

Dim rsSystem As Recordset
Dim sSQL As String

sSQL = "SELECT * FROM Table"
Set rsSystem = CurrentDB.OpenRecordset(sSQL)

我遗失了什么神圣的地狱?

提前致谢。

5 个答案:

答案 0 :(得分:7)

此处的示例,对于打开“Recordset”的所有排列: 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

答案 1 :(得分:7)

如果您声明只是Recordset而未指定它是DAO还是ADO,Access将自行决定它是DAO还是ADO,具体取决于您的引用顺序:

打开代码窗口,转到工具 - >参考,并看那里的清单。
它看起来像这样:
Access references window

您会看到在此示例中,有一个关于DAO(“Microsoft DAO 3.6对象库”) ADO(“Microsoft ActiveX数据对象2.5库”)的引用。

如果在未指定类型的情况下声明Recordset,则Access会选择其中第一个引用(=列表顶部的引用)并创建此类型的Recordset。
因此,在此示例中,它将是DAO.Recordset

现在回到你的问题:
您在不指定类型的情况下声明Recordset 因此,如果您的 Access数据库中的第一个引用是ADO,则Access将创建ADODB.Recordset。 然后用DAO方法打开它,这需要DAO.Recordset,这就是你得到错误的原因。

有两种方法可以解决您的问题:

  1. 确保您的Access数据库仅引用ADO DAO(但不是两者),然后您不需要指定记录集的类型。
  2. 如果您确实需要两个引用,请始终将您的记录集声明为DAO.RecordsetADODB.Recordset,以确保它确实属于您的代码所期望的类型。

答案 2 :(得分:2)

决定是否要使用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

不确定您要对此记录集做什么。

答案 3 :(得分:2)

Dim rsSystem As Recordset

ADO和DAO对象模型都包含Recordset对象。你无法互换它们。

由于你没有指定你想要的,你的可能是一个ADO Recordset ...这将解决OpenRecordset方法上的类型不匹配错误。

Set rsSystem = CurrentDB.OpenRecordset(sSQL)

该方法返回 DAO Recordset,因此首先声明rsSytem。

Dim rsSystem As DAO.Recordset

答案 4 :(得分:1)

“表”是SQL中的保留字。如果必须将表命名为“table”,请将其括在方括号中:"SELECT * FROM [Table]"