Ms access 向vba函数传递参数时获取错误消息:“0”;参数非可选(错误449)";

Ms access 向vba函数传递参数时获取错误消息:“0”;参数非可选(错误449)";,ms-access,vba,adodb,Ms Access,Vba,Adodb,我试图从MS Access 2007中的一个函数中检索ADODB记录集,但收到一条非常恼人的错误消息,它在我面前说:“参数不是可选的(错误449)” 我真的不知道我做错了什么,请帮忙 问候, 斯特凡 功能: Function Rs(sourceSQL As String) As ADODB.Recordset ' Create New Disconnected Recordset Dim rsConnection As ADODB.Connection Dim rsRecordset As

我试图从MS Access 2007中的一个函数中检索ADODB记录集,但收到一条非常恼人的错误消息,它在我面前说:“参数不是可选的(错误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

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

Private Sub Form_Load()

Set Myrs= Rs("tblDocumentCode")

Debug.Print MyRs(0).Value

End Sub
假设“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记录集填充表单——这是默认设置


因此,总的来说,除了语法错误之外,还有一些错误——你所做的根本没有多大意义。

@StefanÅstrand Good。顺便说一句,在Access中使用DAO几乎总是更好的。@Remou:谢谢,但我使用SQL Server作为DB后端,SQL Server不支持DAO。@Stefan Astrand-DAO支持SQL Server。DAO通过ODBC和链接表支持SQL Server,除非在每个查询中指定连接字符串,否则不直接支持SQL Server。ODBC显然是使用SQL Server访问的推荐方式,但它不是直接交互。另一方面,ADO也是非常间接的(这也是MS现在不赞成ADP而赞成使用ODBC的MDB/ACCDB的主要原因之一)。我认为这个答案根本不能确定问题所在。问题不在于缺少记录集变量,而在于它使用了错误的语法。我刚刚尝试了您的示例,但正如我所料,因为rs是一个试图打开记录集rs(“txtDocumentCode”)的函数。值将不起作用,因为名为txtDocumentCode的a表不存在。你是对的——我在你的答案中遗漏了关键点。我的回答经过编辑以反映这一点。