【问题标题】:SQL SP not returning a value to ADO executeSQL SP 未向 ADO 执行返回值
【发布时间】:2020-12-28 05:30:13
【问题描述】:

好的,我在这里遗漏了一些明显的东西——我有一个接收整数 ID 并返回字符串的 SP。我在 DAO 中使用这个 SP 已经有一段时间了。现在我需要切换到 ADO,以便在现有连接下运行它(另一个问题我将在其他地方发布)。

所以我的代码如下。它不返回错误,但也不返回任何结果。输出参数为空。我错过了什么?


Dim adoCon As ADODB.Connection
Dim adoCMD As ADODB.Command
Dim SQLstr As String
Dim ConStr As String

'--- get connection string from existing object, but strip leading odbc; piece
ConStr = Replace(CurrentDb.TableDefs("[TableName]").Connect, "ODBC;", "")

Set adoCon = New ADODB.Connection
adoCon.ConnectionString = ConStr
adoCon.Open

Set adoCMD = New ADODB.Command
With adoCMD
    .ActiveConnection = adoCon
    .CommandType = adCmdStoredProc
    .Parameters.Append .CreateParameter(, adInteger, adParamReturnValue, , Null)  ' return value
    .Parameters.Append .CreateParameter("Path", adVarChar, adParamOutput, 500, Null)
    .Parameters.Append .CreateParameter("AsyID", adInteger, adParamInput)
    .Parameters.Item("AsyID").Value = AsyID
    .CommandText = "dbo.spGetAncestry"
    .Execute
End With

GetHeritage = adoCMD.Parameters(1).Value   'parm(0) = 0; parm(1) = NULL; parm(2) = AsyID

adoCon.Close

【问题讨论】:

    标签: vba ms-access ado


    【解决方案1】:

    虽然您的代码应该可以工作。请删除参数定义中的可选表达式并尝试以下操作:

    Dim rv as Integer
    Set adoCMD = New ADODB.Command
    With adoCMD
        .ActiveConnection = adoCon
        .CommandType = adCmdStoredProc
        .Parameters.Append .CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue)
        .Parameters.Append .CreateParameter("Path", adVarChar, adParamOutput, 500)
        .Parameters.Append .CreateParameter("AsyID", adInteger, adParamInput, , AsyID)
        .CommandText = "dbo.spGetAncestry"
        .Execute
    End With
    
    rv = adoCMD.Parameters("RETURN_VALUE").Value
    
    GetHeritage = adoCMD.Parameters("Path").Value
    

    还要确保您的 SP 为您的输出参数返回正确的数据类型和大小,并相应地调整代码。如果您要返回 VARCHAR(MAX),则在 ADO 中将其视为“BLOB”,请参阅此相关问题 What are the limits for ADO data types?。 在这种情况下,您可以尝试从 SP 返回 varchar(8000) 并相应地更新代码。

    【讨论】:

    • 感谢您的健全性检查,jbud。我尝试了您的建议 - 结果没有变化。 SP 具有与此处声明的相同的类型和大小 - VARCHAR(500)。实际结果大约有 100 个字符。
    【解决方案2】:

    找到了。 显然,在 ADO 调用中,当它在 SQL 批处理中执行时,将返回值设置为(我试图使用“”甚至“”,然后将其设置为 null)并不重要,它只是设置为在此跟踪表单中显示为 NULL。对于本次运行,输出初始化为“”,但批次传入 NULL。 [!在初始化输出变量1中使用“”执行上述查询的SQL跟踪]1

    通常,null 不会成为问题,因为典型的 SP 分配是: SET @Path = [从表中选择值] 或者,如果它是一个串联,您将初始化变量: SET @Path = '' 在将输入串在一起之前。 但是,在这种特殊情况下,SP 是递归的。它调用自己将输入和输出值传递给新副本。因此,您无法初始化该值,也无法使用直接赋值。为了解决这个问题,我需要使用: @path = COALESCE(@path, '') + [从表中选择值] 捕获传入的任何 NULL。

    【讨论】:

    • 对于未来的读者,您能否清晰地重写此答案,这可能会有所帮助?具体来说,请显示(不要告诉)SP 或 VBA 代码中应该更改的内容。如果没有任何改变,请明确说明。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2011-05-06
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多