Получить сообщение об ошибке при передаче аргументов в функцию vba: «Аргумент не является обязательным (ошибка 449)» - PullRequest
2 голосов
/ 22 августа 2010

Я пытаюсь получить набор записей ADODB из функции в MS-Access 2007, но мне в лицо выдается очень досадное сообщение об ошибке, говорящее: «Аргумент не является обязательным (Ошибка 449)».

Я действительно не могу понять, что я делаю неправильно, пожалуйста, помогите!

С уважением,

Stefan

ФУНКЦИЯ:

Function Rs(sourceSQL As String) As ADODB.Recordset

' Create New Disconnected Recordset

Dim rsConnection As ADODB.Connection
Dim rsRecordset As ADODB.Recordset

Set rsConnection = New ADODB.Connection
rsConnection.Open CurrentProject.Connection

Set rsRecordset = New ADODB.Recordset

rsRecordset.CursorLocation = adUseClient
rsRecordset.Open sourceSQL, rsConnection

Set Rs = rsRecordset

Set rsRecordset.ActiveConnection = Nothing

End Function

ФУНКЦИОНАЛЬНЫЙ ВЫЗОВ:

Private Sub Form_Load()

Call Rs("tblDocumentCode")

Debug.Print Rs.txtDocumentCode(0).Value

End Sub

Ответы [ 2 ]

4 голосов
/ 22 августа 2010

Вы используете rs дважды, один раз как функцию, один раз как имя набора записей:

Private Sub Form_Load()

Set Myrs= Rs("tblDocumentCode")

Debug.Print MyRs(0).Value

End Sub
0 голосов
/ 23 августа 2010

Предполагая, что "txtDocumentCode" является полем в наборе записей, это:

  Private Sub Form_Load()
    Call Rs("tblDocumentCode")
    Debug.Print Rs.txtDocumentCode(0).Value
  End Sub

... следует изменить на это:

  Private Sub Form_Load()
    Debug.Print Rs("tblDocumentCode").Fields("txtDocumentCode").Value
  End Sub

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

Но позвольте мне сделать шаг назад и предположить, что исправление этой синтаксической ошибки заставляет задуматься над вопросом: что с ней делать, довольно нецелесообразно. Каждый раз, когда вызывается эта функция, вы открываете новое соединение, но Access работает лучше с одним соединением, которое используется снова и снова. Это верно как для серверной части Jet / ACE, так и для серверной части. Издержки, необходимые для инициализации соединения, заставят ваши формы загружаться очень медленно.

Но что еще хуже, это не программирование Access - это «беженец из среды программирования, в которой отсутствуют связанные формы / элементы управления». Вы должны использовать ODBC со связанными таблицами, а затем вы можете назначать источники записей для своих форм, не прибегая к помощи наборов записей ADO. Если вы настаиваете на том, чтобы делать то, что делаете, с тем же успехом вы можете вообще не использовать Access, потому что вы отказываетесь от 75% или более преимуществ Access и не получаете от этого никаких преимуществ в плане производительности или параллелизма. (и покупая себе мир проблем).

Конечно, теперь, когда я еще раз посмотрю, вы используете CurrentProject.Connection, и я не уверен, как это взаимодействует со связанными таблицами ODBC. На самом деле, я думаю, возможно, что это ADP, а не MDB / ACCDB, но это имеет еще меньший смысл, так как вам не нужно делать ничего дополнительного в ADP, чтобы заполнить ваши формы наборами записей ADO - это по умолчанию.

Итак, в общем, что-то не так, кроме синтаксической ошибки - то, что вы делаете, просто не имеет большого смысла.

...