2010-09-15 92 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引用。