Ошибка компиляции в коде VBA в MS Access - PullRequest
1 голос
/ 15 сентября 2010

У меня есть следующая функция в доступе, которая работала довольно хорошо. Но теперь внезапно я начинаю получать ошибку компиляции: метод или элемент данных не найден

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.

Это ошибка случайно?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

Попробуйте:

Dim rs As DAO.Recordset

И если это не скомпилируется, убедитесь, что у вас все еще есть ссылка на библиотеку объектов Microsoft DAO xx.

2 голосов
/ 16 сентября 2010

Существуют две возможные библиотеки интерфейса данных в Access, DAO (собственная библиотека) и ADO, и обе имеют объекты Recordset.Только DAO имеет метод FindFirst - в ADO это Find.Как указывает @Remou в своем ответе, вы можете указать библиотеку и избежать двусмысленности.

В большинстве случаев очень мало причин предполагать использование чего-либо, кроме DAO, в качестве интерфейса по умолчанию в приложении Access (MDB / ACCDB).Для ADP, конечно, ADO является единственным выбором вообще (поскольку ADP без Jet).

В случае вашего кода вы явно используете DAO (так как вы используете переменную базы данных, котораяне существует в ADO - вместо этого вы используете объекты подключения), поэтому, возможно, у вас либо неправильная ссылка (ADO), либо ADO и DAO, и они в порядке с ADO вначале.

InВ общем, почти никогда не бывает случаев, когда уместно иметь обе ссылки, по моему мнению - это только усложняет ситуацию.ADO можно использовать без ссылки (DAO тоже может быть), но это связано со слабой типизацией переменных вашего объекта и потерей Intellisense на них.Обычная практика состоит в том, чтобы использовать в основном DAO и, возможно, случайное погружение в ADO для вещей, которых DAO не хватает (или делает менее эффективно, чем ADO).Для таких случайных нужд ADO вы можете использовать объект CurrentProject.Connection и вводить переменные в качестве объектов и полностью обходиться без ссылки на ADO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...