将参数传递给vba函数时获取错误消息:“参数不可选(错误449)”

时间:2010-08-22 10:33:57

标签: ms-access vba adodb

我正在尝试从MS-Access 2007中的函数中检索ADODB记录集,但是在我的脸上发出一条非常恼人的错误消息:“参数不是可选的(错误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 个答案:

答案 0 :(得分:4)

您使用rs两次,一次作为函数,一次作为记录集的名称:

Private Sub Form_Load()

Set Myrs= Rs("tblDocumentCode")

Debug.Print MyRs(0).Value

End Sub

答案 1 :(得分:0)

假设“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,因为你放弃了Access的75%或更多的优势,并且这样做没有性能或并发性好处(给自己买一个问题的世界)。

当然,现在我再次查看它,你正在使用CurrentProject.Connection,我不确定它是如何与ODBC链接表交互的。实际上,我猜这可能是ADP而不是MDB / ACCDB,但这更没意义,因为你不需要在ADP中做任何额外的事情来用ADO记录集填充表单 - 这就是默认值。

所以,一般来说,除了语法错误之外还有一些问题 - 你所做的事情并没有多大意义。