2011-05-17 87 views
6

我已经使用Access代码已经有多年了,它让我感到非常疯狂。在Access 2003/2007中打开记录集

我只是不记得任何东西,我想要做的就是在代码中打开一个记录集,并且我没有在网上找到任何东西,或者我已经尝试过的任何代码组合。

它的短:

Dim rsSystem As Recordset 
Dim sSQL As String 

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

什么在神圣的地狱我缺少什么?

在此先感谢。

+0

我得到OpenRecordset方法的类型不匹配错误。我使用上面显示的代码,没有DAO或ADODB限定符。 – Tom 2011-05-17 17:57:24

+0

如果您在代码窗口中,则从菜单栏打开** Tools/References **可以进入** Add References **对话框。 – 2011-05-17 18:14:54

+0

@Robert - 啊,谢谢 – Tom 2011-05-17 18:21:53

回答

7

例子在这里,打开一个“记录”的所有排列: 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 
+0

我不能使用某种CurrentDB限定符,而不必使用连接字符串,因为我想查询的所有内容都包含在Access数据库中? – Tom 2011-05-17 17:58:31

+0

好吧,我不必添加对DAO的引用吗?我无法从Access 2010中找到任何地方。 – Tom 2011-05-17 18:04:44

+0

试试我上面添加的ADO。 – 2011-05-17 18:07:17

1

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

不确定你想用这个记录集做什么。

+0

当我尝试添加它时,我没有在上下文列表中看到DAO,我确定它只是我需要添加到MDB的参考,但对于我的生活,我无法在Access 2010 IDE中的任何位置找到参考 – Tom 2011-05-17 18:14:09

2
Dim rsSystem As Recordset 

ADO和DAO对象模型都包含Recordset对象。你不能交换它们。

既然你没有指定你想要的,你可能是一个ADO记录集......它将解决OpenRecordset方法的类型不匹配错误。

Set rsSystem = CurrentDB.OpenRecordset(sSQL) 

该方法返回一个DAO记录,所以首先声明rsSytem本身。

Dim rsSystem As DAO.Recordset 
+0

是的,谢谢。上面@罗伯特的解决方案最适合我。所有这些Access的东西现在都开始回到我身上了。 – Tom 2011-05-17 18:22:40

+1

如果我对上面的评论有所了解,那么你决定和ADO一起去做,而这只是被误导了。它确实反映了MS在10年前推广的内容,但他们错误地这样做,并且从此停止将DAO推广到用于使用Jet/ACE/ODBC数据访问的ADO。 – 2011-05-19 15:55:05

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以确保它确实是您的代码所期望的类型。
+0

感谢您的详细解释。 – Tom 2011-05-17 18:29:31

2

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

相关问题