将访问表单绑定到存储过程的结果

Posted

技术标签:

【中文标题】将访问表单绑定到存储过程的结果【英文标题】:Bind Access form to the results from a Stored Procedure 【发布时间】:2011-01-24 17:09:37 【问题描述】:

我正在尝试将存储过程的结果返回到表单。我已经设法使用 ADO 记录集遍历结果,但无法将结果绑定到表单..

这是 VBA 代码:

Private Sub RetrieveSiteInformation()

  Dim cmd As New ADODB.Command
  Dim cnn As New ADODB.Connection
  Dim rs As ADODB.Recordset, f As ADODB.Field

  With cnn
    .Provider = "SQLOLEDB"
    .ConnectionString = 
        "data source=UKFCSVR;initial catalog=ACACB;Trusted_Connection=Yes"
    .Open
  End With

  Dim param1  As ADODB.Parameter
  If Nz(txtSiteID_Search.Value, vbNullString) <> vbNullString Then
    Set param1 = cmd.CreateParameter("@SiteID", adBigInt, adParamInput)
    param1.Value = txtSiteID_Search.Value
    cmd.Parameters.Append param1
  End If

  With cmd
   .ActiveConnection = cnn
   .CommandText = "spSiteInformation_Retrieve"
   .CommandType = adCmdStoredProc
    **' THIS FAILS**
    Me.Recordset = .Execute
    **' THIS LOOP WORKS FINE**
    '    Set rs = .Execute
    '    rs.MoveFirst
    '    For Each f In rs.Fields
    '      Debug.Print f.Name
    '    Next
    '    With rs
    '      Do While Not .EOF
    '        Debug.Print ![CompanyName] & " " & ![Postcode]
    '        .MoveNext
    '      Loop
    '    End With
  End With
  cnn.Close
End Sub

【问题讨论】:

【参考方案1】:

好的,我已经测试了这个例子。它包括更改以适应我留下的设置,而不是猜测您的设置。大部分取自http://support.microsoft.com/kb/281998/EN-US/

Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim param1  As New ADODB.Parameter

    With cn
        .Provider = "Microsoft.Access.OLEDB.10.0"
        .Properties("Data Provider").Value = "SQLOLEDB"
        .Properties("Data Source").Value = "Server"
        .Properties("Integrated Security").Value = "SSPI"
        .Properties("Initial Catalog").Value = "Test"
        .Open
    End With

    txtSiteID_Search = 1

    If Nz(txtSiteID_Search, vbNullString) <> vbNullString Then
        Set param1 = cmd.CreateParameter("@SiteID", adBigInt, adParamInput)
        param1.Value = txtSiteID_Search
        cmd.Parameters.Append param1
    End If

    With cmd
        .ActiveConnection = cn
        .CommandText = "spSiteInformation_Retrieve"
        .CommandType = adCmdStoredProc
        Set Me.Recordset = .Execute
    End With

【讨论】:

Remou:很好,我认为您不能使用 ADO rs 作为表单记录源。 FMY,与我提出的 PTQ 解决方案相比,有什么好处吗? @iDevelop 我完全不确定,但有些事情你可以用 ADO 做而你不能用 DAO 做。同时使用 ADO 和 DAO 有一些优点,因此设置 Access 以同时使用这两种方法通常是一个好主意。另外,我认为传递查询使用 ODBC,但 OLEDB 可能会提供更好的性能 (database.ittoolbox.com/documents/odbc-vs-oledb-18150)【参考方案2】:

忘记 ADO。在 Access 中创建一个直通查询,属性为 ReturnsRecords = True。 将您的表单绑定到该直通查询。 使用 VBA,更改该 QueryDef 对象的 .SQL 属性,然后打开窗体。你完成了。

Set qry = CurrentDb.QueryDefs("myQryDef")
qry.SQL = "exec spMyStoredProc " & "'argument1'"

【讨论】:

该项目目前是一个 mdb.. 我正在将后端迁移到 SQL 2005.. 如果可能的话,我想将其保留为 mdb.. 肯定可以在 ADO 中完成吗? 对于 mdb,您通常使用 DAO(嗯...我愿意)。我的解决方案是一个 mdb。打开表单后,您可以根据需要使用 Me.RecordsetClone。但请注意,这将为您提供 DAO 记录集,而不是 ADO。 Access 对 DAO 记录集更加友好,因为这是它的原生数据接口。 ADO 是在 A2000 时间框架内移植的,并不适合。事实上,它有很多问题。如果您使用的是 ODBC 链接表,那么您将通过 Jet/ACE,因此您可能希望在任何链接表上使用 DAO。 Passthrough 会绕过 Jet/ACE 查询优化器,但仍会通过 Jet/ACE 和 ODBC。【参考方案3】:

每当您在 VBA 中分配对象引用时,都需要使用 Set

Me.Recordset = .Execute 更改为Set Me.Recordset = .Execute

另外,您可能需要使用支持的光标类型打开它。如果您在 Command 对象上使用 Execute 方法,我认为没有办法更改光标类型。您必须单独创建记录集。

Set rs = New ADODB.Recordset
rs.Open cmd, , adOpenKeyset
Set Me.Recordset = rs

【讨论】:

运行时错误 '7965' 您输入的对象不是有效的 Recordset 属性。 我认为 Access 表单需要 DAO 记录集,而不是 ADO。 不,它也支持 ADO。 Recordset 可能有错误的游标类型。 嗨,Tmdean 尝试了您的最新建议,但仍然得到相同的错误:运行时错误“7965”您输入的对象不是有效的记录集属性我已经仔细检查了 SP 从中提取的表和它有一个主键。你有一个从 SP 提取结果的工作示例吗?这真是令人沮丧.. 作为记录,我使用 ADO 记录集没有问题,尽管我没有通过存储过程获取它们。

以上是关于将访问表单绑定到存储过程的结果的主要内容,如果未能解决你的问题,请参考以下文章

将文本框从“表单”传递到存储过程会导致错误

如何将从存储过程创建的绑定源绑定到gridview

数据访问设计:多个结果集单个存储过程或每个存储过程单个结果集

如何将存储过程中的多个结果存储到数据集中?

将存储过程中选择查询的结果返回到列表

如何将结果集作为输入从java传递到oracle存储过程