Gar*_*eth 7 sql-server vba stored-procedures ado recordset
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我接收到错误Operation is not allowed when the object is closed就行If Not oRS.BOF...这表明,我认为存储过程没有返回结果.
但是,如果我在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
Run Code Online (Sandbox Code Playgroud)
在SSMS中执行该过程的结果是:
id col1
__ ____
1 1
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助解决记录集关闭/未填写的原因吗?
Mac*_*Los 18
基于类似的问题:"当关闭对象时不允许操作"执行我在评论中建议的存储过程时:
我怀疑有两个原因:1)你的sp不包含:
SET NOCOUNT ON;和2)你正在处理类型为:table的变量.
最常见的原因Operation is not allowed when the object is closed是该存储过程不包含SET NOCOUNT ON命令,这会阻止额外的结果集干扰SELECT语句.
有关详细信息,请参阅:SET NOCOUNT(Transact-SQL)