【发布时间】:2015-04-24 23:34:04
【问题描述】:
我正在使用 VBA 中的 ADO 执行存储过程。我正在尝试使用 SQL Server 2008 中存储过程的结果填充记录集。下面的 VBA 示例:
Public Function DoSomething() As Variant()
Dim oDB As ADODB.Connection: Set oDB = New ADODB.Connection
Dim oCM As ADODB.Command: Set oCM = New ADODB.Command
Dim oRS As ADODB.Recordset
oDB.Open gcConn
With oCM
.ActiveConnection = oDB
.CommandType = adCmdStoredProc
.CommandText = "spTestSomething"
.NamedParameters = True
.Parameters.Append .CreateParameter("@Param1", adInteger, adParamInput, , 1)
Set oRS = .Execute
End With
If Not oRS.BOF And Not oRS.EOF Then 'Error thrown here'
DoSomething = oRS.GetRows()
Else
Erase DoSomething
End If
oRS.Close
Set oRS = Nothing
oDB.Close
Set oDB = Nothing
End Function
我在If Not oRS.BOF... 行收到错误Operation is not allowed when the object is closed,这表明存储过程没有返回结果。
但是,如果我在 SSMS 中执行存储过程,它会返回一行。 SP 遵循以下原则:
CREATE PROC spTestSomething
@Param1 int
AS
BEGIN
DECLARE @TempStore table(id int, col1 int);
INSERT INTO table1
(param1)
OUTPUT inserted.id, inserted.col1
INTO @TempStore
VALUES
(@Param1);
EXEC spOtherSP;
SELECT
id,
col1
FROM
@TempStore;
END
GO
在SSMS中执行过程的结果是:
id col1
__ ____
1 1
谁能帮助解释为什么记录集被关闭/未填充?
【问题讨论】:
-
要确定有多少条记录受到了 SP 的影响,请使用
Exceute方法和参数:msdn.microsoft.com/en-us/library/windows/desktop/… 而不是 BOF 和 EOF -
@MaciejLos 感谢您的回复。由于正在执行多个 SP,因此影响了多行。您是否建议在尝试使用记录集之前检查这一点?谢谢
-
是的。在这种情况下,不需要检查 BOF 和 EOF 方法返回的值。如果 RecordsAffected 参数返回大于零的值,则记录集将填充值 ;)
-
@MaciejLos 大多数情况下,受影响的记录将在 MS Access 中返回 -1。
-
关注
SET NOCOUNT ON谢谢。将其粘贴在答案中,我会接受。再次感谢
标签: sql-server vba stored-procedures ado recordset