2010-09-15 69 views
1

我在訪問中有以下功能,工作得很好。但現在突然我開始得到一個編譯錯誤:方法或數據成員找不到MS Access中的VBA代碼中的編譯錯誤

Function Serialize(qryname As String, keyname As String, keyvalue) As Long 
Dim dbs As Database 
Dim rs As Recordset 

Set dbs = CurrentDb 
On Error GoTo Err_Serialize 
Set rs = dbs.OpenRecordset(qryname, dbOpenDynaset, dbReadOnly) 


    On Error GoTo Err_Serialize 

    'Find the current record.' 
    Select Case rs.Fields(keyname).Type 
     ' Find using numeric data type key value?' 
     Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _ 
     DB_DOUBLE, DB_BYTE 
      rs.FindFirst "[" & keyname & "] = " & keyvalue 
     ' Find using date data type key value?' 
     Case DB_DATE 
      rs.FindFirst "[" & keyname & "] = #" & keyvalue & "#" 
     ' Find using text data type key value?' 
     Case DB_TEXT 
      rs.FindFirst "[" & keyname & "] = '" & keyvalue & "'" 
     Case Else 
      MsgBox "ERROR: Invalid key field data type!" 

    End Select 

    Serialize = Nz(rs.AbsolutePosition, 0) + 1 


Err_Serialize: 
     'Add your own Error handler' 
     rs.Close 
     dbs.Close 
     Set rs = Nothing 
     Set dbs = Nothing 

End Function 

錯誤凸顯rs.Findfirst

這是一個錯誤嗎?

回答

3

嘗試:

Dim rs As DAO.Recordset 

如果無法編譯,請確保你仍然有引用到Microsoft DAO x.x中對象庫。

2

Access,DAO(本機庫)和ADO中有兩種可能的數據接口庫,並且都有Recordset對象。只有DAO具有FindFirst方法 - 在ADO中,它是Find。正如@Remou在他的回答中指出的那樣,您可以指定庫並避免含糊不清。

大多數情況下,沒有理由在Access應用程序(MDB/ACCDB)中考慮使用除DAO以外的其他任何東西作爲默認接口。對於ADP,當然,ADO是唯一的選擇(因爲ADP是無噴射的)。在你的代碼的情況下,你很清楚地使用了DAO(因爲你使用了一個數據庫變量,這在ADO中不存在 - 你使用連接對象),所以你可能有錯誤的引用( ADO),或者您同時擁有ADO和DAO,並且首先與ADO訂購。

一般來說,在我看來,幾乎從來沒有一個適合同時提供這兩個參考的情況 - 這隻會讓一切變得更加困難。 ADO可以在沒有引用的情況下使用(DAO也可以),但是它涉及對象變量的弱類型以及對它們的Intellisense丟失。通常的做法是大部分使用DAO,偶爾也會偶爾陷入ADO中,因爲DAO缺乏(或者效率低於ADO)。對於那些偶爾的ADO需求,可以使用CurrentProject.Connection對象,並將變量作爲對象輸入,並且完全沒有ADO引用。