【问题标题】:How Do I Return Multiple Recordsets from SQL Stored Procedure in Access 2010如何从 Access 2010 中的 SQL 存储过程返回多个记录集
【发布时间】:2013-12-03 16:04:58
【问题描述】:

我在 Access 中创建了一个传递查询,它执行一个存储过程,在我的 SQL 数据库中的所有表中搜索字符串。 SQL 服务器上的存储过程按预期运行,返回多个包含我的搜索字符串值的记录集。但是,当我在 Access 中双击传递查询时,在数据表视图中我只看到一个记录集的结果。既然 Access 似乎不是为处理多个结果集而设计的,那我该如何在 Access 中使用 VBA 来完成呢?

exec sqlsp_searchalltables @Tablenames='',  @SearchStr='%motion%'

【问题讨论】:

    标签: sql sql-server-2008 stored-procedures views ms-access-2010


    【解决方案1】:

    我不太确定您希望如何将表单“绑定”到存储过程返回的多个记录集,但据我所知,处理返回多个记录集的 SQL Server 存储过程的唯一方法是使用 ADODB.Recordset 对象。

    (不要被“Recordset.NextRecordset 方法 (DAO)”文章 here 误导。如果您尝试该方法,您将收到运行时错误“3847”:“不再支持 ODBCDirect。重写代码使用 ADO 而不是 DAO。")

    例如,我有一个返回两个记录集的 SQL Server 存储过程,我创建了一个名为 [dbo_myMultiRsSp_1] 的传递来调用它:

    EXEC dbo.myMultiRsSp @id=1
    

    如果我通过双击在数据表视图中打开它,我会看到第一个记录集的结果。

    如果我想处理 VBA 中的所有记录集,我不能直接使用传递查询,但我可以使用它的 .Connect.SQL 属性,如下所示

    Option Compare Database
    Option Explicit
    
    Sub MultiRsSpTest()
        Dim cdb As DAO.Database
        Dim con As ADODB.Connection, cmd As ADODB.Command
        Dim r1 As ADODB.Recordset, r2 As ADODB.Recordset
    
        Set cdb = CurrentDb
        Set con = New ADODB.Connection
    
        ' connect directly to the SQL Server 
        '    (by using the .Connect property of the pass-through query)
        con.Open Mid(cdb.QueryDefs("dbo_myMultiRsSp_1").Connect, 5)  ' omit "ODBC:" prefix
        Set cmd = New ADODB.Command
        cmd.ActiveConnection = con
        cmd.CommandType = adCmdText
        cmd.CommandText = cdb.QueryDefs("dbo_myMultiRsSp_1").SQL
    
        Set r1 = cmd.Execute
        Debug.Print
        Debug.Print "First Recordset:"
        Do Until r1.EOF
            Debug.Print r1(0).Value
            r1.MoveNext
        Loop
    
        Set r2 = r1.NextRecordset
        Debug.Print
        Debug.Print "Second Recordset:"
        Do Until r2.EOF
            Debug.Print r2(0).Value
            r2.MoveNext
        Loop
    
        ' r1.Close  (happens implicitly)
        Set r1 = Nothing
        r2.Close
        Set r2 = Nothing
        Set cmd = Nothing
        Set con = Nothing
        Set cdb = Nothing
    End Sub
    

    【讨论】:

    • 谢谢。抱歉,我的问题措辞错误,应该说我的表单未绑定到搜索结果,我正在使用 .Connect 和 .sql 属性在未绑定控件中列出结果,但我想我仍在尝试使用直接通过查询。我会试试你的方法,让你知道结果如何。
    • 我认为这个解决方案对我很有效,并且可以使用我在这篇支持文章中找到的一些代码来调整它:support.microsoft.com/kb/182290)。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 2014-01-04
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多