如何从 Access 2010 中的 SQL 存储过程返回多个记录集
Posted
技术标签:
【中文标题】如何从 Access 2010 中的 SQL 存储过程返回多个记录集【英文标题】:How Do I Return Multiple Recordsets from SQL Stored Procedure in Access 2010 【发布时间】:2013-12-03 16:04:58 【问题描述】:我在 Access 中创建了一个传递查询,它执行一个存储过程,在我的 SQL 数据库中的所有表中搜索字符串。 SQL 服务器上的存储过程按预期运行,返回多个包含我的搜索字符串值的记录集。但是,当我在 Access 中双击传递查询时,在数据表视图中我只看到一个记录集的结果。既然 Access 似乎不是为处理多个结果集而设计的,那我该如何在 Access 中使用 VBA 来完成呢?
exec sqlsp_searchalltables @Tablenames='', @SearchStr='%motion%'
【问题讨论】:
【参考方案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)。以上是关于如何从 Access 2010 中的 SQL 存储过程返回多个记录集的主要内容,如果未能解决你的问题,请参考以下文章
如何检索 MS-Access 中的最后一个自动增量值,例如 Sql Server 中的 @@Identity