【问题标题】:Get Error message when passing arguments to a vba function: "Argument not optional (Error 449)"将参数传递给 vba 函数时获取错误消息:“参数不是可选的(错误 449)”
【发布时间】:2011-04-02 06:02:20
【问题描述】:

我正在尝试从 MS-Access 2007 中的函数中检索 ADODB 记录集,但收到一条非常烦人的错误消息:“Argument not optional (Error 449)”。

我真的不知道我做错了什么,请帮忙!

问候,

斯蒂芬

功能:

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

【问题讨论】:

    标签: ms-access vba adodb


    【解决方案1】:

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

    Private Sub Form_Load()
    
    Set Myrs= Rs("tblDocumentCode")
    
    Debug.Print MyRs(0).Value
    
    End Sub
    

    【讨论】:

    • @Stefan Åstrand 好。顺便说一句,将 DAO 与 Access 一起使用几乎总是更好。
    • @Remou:谢谢,但我使用 SQL Server 作为 DB 后端,SQL Server 不支持 DAO。
    • @Stefan Astrand - DAO 支持 SQL Server。
    • DAO 通过 ODBC 支持带有链接表的 SQL Server,而不是直接支持 SQL Server,除非您在每个查询中指定连接字符串。 ODBC 显然是使用 SQL Server 使用 Access 的推荐方式,但它不是直接交互。另一方面,ADO 也是相当间接的(这也是 MS 现在弃用 ADP 转而支持带 ODBC 的 MDB/ACCDB 的主要原因之一)。
    • 我认为这个答案根本无法确定问题所在。问题不在于缺少记录集变量,而在于它使用了错误的语法。
    【解决方案2】:

    假设“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 记录集填充您的表单——它是默认。

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

    【讨论】:

    • 我刚刚尝试了您的示例,但正如我所料,因为 rs 是一个尝试打开记录集的函数,所以 Rs("txtDocumentCode").Value 将不起作用,因为名为 txtDocumentCode 的表不存在。
    • 你是对的——我错过了你回答的关键点。我的答案已编辑以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多