【问题标题】:Retrieving stored procedure output parameter via ADO通过 ADO 检索存储过程输出参数
【发布时间】:2013-11-24 13:30:04
【问题描述】:

我已经坚持了 48 小时以上。我正在尝试使用 ADO 对象检索输出参数值。这是我的 vba 代码。

Function ExecuteCommand(cSp As String, aParameters As Variant) As Integer

Dim lnReturn As Integer
Dim loCommand As ADODB.Command
Dim prm As ADODB.Parameter
Dim rds As ADODB.Recordset

Set loCommand = New ADODB.Command

loCommand.CommandText = cSp
loCommand.CommandType = adCmdStoredProc
Set loCommand.ActiveConnection = goConnection
loCommand.NamedParameters = True

Dim iCount As Integer

For iCount = LBound(aParameters) To UBound(aParameters)
    If aParameters(iCount, 0) <> "" Then
        If aParameters(iCount, 1) = adNumeric Then
            Set prm = loCommand.CreateParameter(aParameters(iCount, 0), aParameters(iCount, 1), adParamInput)
            prm.Precision = 18
            prm.NumericScale = 0
            prm.Value = aParameters(iCount, 3)
        Else
            Set prm = loCommand.CreateParameter(aParameters(iCount, 0), aParameters(iCount, 1), adParamInput, , aParameters(iCount, 3))
        End If
        loCommand.Parameters.Append prm
    End If
Next

Set prm = loCommand.CreateParameter("@returnval", adInteger, adParamOutput, , lnReturn)
loCommand.Parameters.Append prm

Set rds = loCommand.Execute
' Check the value of lnReturn and it's zero here.
lnReturn = loCommand.Parameters("@returnval").Value


ExecuteCommand = lnReturn

End Function

我的存储过程如下...

USE [table_name]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[spname]
@para1 int,
@para2 int,
@para3 int,
@returnval int Output
AS
BEGIN

SET NOCOUNT ON;

SELECT * FROM type_table WHERE type1=@para1 and type2=@para2 and type3=@para3
SET @returnval = @@ROWCOUNT
RETURN @returnval
END

这是我的发现

lnReturn = 0 always
rds.EOF = False
rds.RecordCount = -1

我的问题是我没有得到正确的受影响行数,即 1。我不确定代码有什么问题,有人可以帮帮我吗?

【问题讨论】:

  • 使用 32767 作为整数返回参数大小是错误的,大小参数是以字符/字节为单位的最大大小。将其留空以使用默认值或显式传递 4(32 位 int 中的字节)。
  • 感谢您指出,我修改了代码以传递空大小。但它并没有为我面临的问题增加任何区别。

标签: sql-server excel vba stored-procedures ado


【解决方案1】:

如果您不希望将记录集作为存储过程调用的一部分,请使用 cmd1->Execute(NULL, NULL, ADO::adExecuteNoRecords);

【讨论】:

    【解决方案2】:

    这可能是因为,正如 Technet 所说, In the case of output parameters and return values, the values are not returned until the data of the Recordset object has been fetched completely or the Recordset has been closed.

    如果您对 SELECT 语句返回的数据不感兴趣,请关闭您的 RecordSet (rds.Close),或者循环遍历它直到您读取所有行。

    顺便说一句,如果您从不对 select 语句返回的数据感兴趣,只对行数感兴趣,那么不返回它会更有效。因此,如果您可以修改您的 SP,您可以将其更改为:

    SELECT @returnval = COUNT(*) FROM type_table WHERE type1=@para1 and type2=@para2 and type3=@para3
    

    【讨论】:

    • 我在分配 lnReturn 之前添加了 rds.Close 行,它解决了问题。所以你是男主角!!
    【解决方案3】:

    从您的过程中删除 SET NOCOUNT ON; 后尝试一下

    我认为这会对您有所帮助。如果在过程中设置SET NOCOUNT ON;,则不会返回受影响的行数。

    【讨论】:

    • 我已经厌倦了它,它没有任何区别。此外,当我尝试通过 Management Studio 执行 SP 时,我得到了正确的值,而不管 SET NOCOUNT ON/OFF。
    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多