2011-05-17 84 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]"