我在Access中创建了一个传递查询,它执行一个存储过程,搜索SQL数据库中所有表的字符串。 SQL Server上的存储过程按预期运行,返回包含我的搜索字符串值的多个Recordset。但是,当我在Access中双击传递查询时,在数据表视图中,我只看到一个Recordset的结果。由于Access似乎不是为处理多个结果集而设计的,那么如何在Access中使用VBA来实现此目的呢?
exec sqlsp_searchalltables @Tablenames='', @SearchStr='%motion%'
答案 0 :(得分:3)
我不太确定您希望如何将表单“绑定”到存储过程返回的多个记录集,但据我所知,处理返回多个记录集的SQL Server存储过程的唯一方法是使用ADODB.Recordset对象。
(不要被“Recordset.NextRecordset Method(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