【问题标题】:Execute Stored Procedure from Classic ASP从经典 ASP 执行存储过程
【发布时间】:2010-04-22 09:50:48
【问题描述】:

出于某种奇妙的原因,我发现自己在调试经典 ASP 页面中的一个问题(在过去的 2 天里我失去了至少 10 年的生命)。

我正在尝试执行一个包含一些 OUT 参数的存储过程。问题是存储过程返回时未填充 OUT 参数之一。我可以从 SQL 管理工作室(这是 2008 年)执行存储过程,并且所有值都按预期设置和返回。

declare @inVar1 varchar(255)
declare @inVar2 varchar(255)
declare @outVar1 varchar(255)
declare @outVar2 varchar(255)

SET @inVar2  = 'someValue'

exec theStoredProc @inVar1 , @inVar2 , @outVar1 OUT, @outVar2 OUT

print '@outVar1=' + @outVar1
print '@outVar2=' + @outVar2 

效果很好。极好的。完美的。正在返回并打印出我期望的确切值。

好的,因为我正在尝试调试经典 ASP 页面,所以我将代码复制到 VBScript 文件中以尝试缩小问题范围。

这是我想出的:

Set Conn = CreateObject("ADODB.Connection")
Conn.Open "xxx"

Set objCommandSec = CreateObject("ADODB.Command")
objCommandSec.ActiveConnection = Conn

objCommandSec.CommandType = 4
objCommandSec.CommandText = "theStoredProc "

objCommandSec.Parameters.Refresh

objCommandSec.Parameters(2) = "someValue"

objCommandSec.Execute

MsgBox(objCommandSec.Parameters(3))

不起作用。一点儿都没有。 (我的生命又过了十年)第三个参数只是 NULL - 这也是我在 Classic ASP 页面中遇到的情况。

有人能解释一下吗?我是否完全愚蠢地认为经典的 ASP 代码与 VBScript 代码相同?我认为它使用相同的脚本引擎和语法,所以我应该没问题,但我不是 100% 确定。

我在 VBScript 中看到的结果与我在 ASP 中看到的结果相同。

【问题讨论】:

    标签: asp-classic vbscript


    【解决方案1】:

    试试

    With objCommandSec
     Set .ActiveConnection = Conn
     .CommandType = 4
     .CommandText = "theStoredProc"
     .Parameters.Append .CreateParameter("@inVar1", 200, 1, 255, VALUE1)
     .Parameters.Append .CreateParameter("@inVar2", 200, 1, 255, VALUE2)
     .Parameters.Append .CreateParameter("@outVar1", 200, 2, 255)
     .Parameters.Append .CreateParameter("@outVar2", 200, 2, 255)
    
     .Execute
    
     Response.Write .Parameters(3).Value
    End With 
    

    如果您知道参数详细信息,您也应该避免使用.Refresh,因为它涉及返回服务器。

    【讨论】:

    • 返回值还是空白 :-(
    • 这对我有用:pastebin.com/RsqwzJ02(来自 .VBS)您是否可能在 On Error Resume Next 之后运行它?
    • 该示例对我有用,但如果我修改存储过程中的变量类型,它就不起作用 - 你将如何访问我发布的那个? pastebin.com/qr2jVHSA
    • 哇,实际问题出在存储过程的权限上,但您的示例帮助我解决了这个问题。谢谢
    • 对于 ints,类型是 adinteger (3) 而不是 advarchar (200),大小是 4(32 位整数中的 4 个字节)所以; .Parameters.Append .CreateParameter("@inVar1", 3, 1, 4, 123456) .Parameters.Append .CreateParameter("@outVar1", 3, 2, 4)
    【解决方案2】:

    不要忘记将Direction 设置为Output

    objCommandSec.Parameters(3).Direction = 2
    

    【讨论】:

    • Refresh 调用不应该自动执行此操作吗?无论如何,它没有任何区别
    【解决方案3】:

    这里有另一个解决方案。

    Set Conn = CreateObject("ADODB.Connection")
    Conn.Open "xxx"
    
    Set objCommandSec = CreateObject("ADODB.Command")
    objCommandSec.ActiveConnection = Conn
    objCommandSec.CommandType = 4
    objCommandSec.CommandText = "theStoredProc "
    
    objCommandSec.Parameters.Refresh
    
    objCommandSec.parameters.append objCommandSec.createParameter("@inVar1", adVarChar, adParamInput, 255, "someValue1")
    objCommandSec.parameters.append objCommandSec.createParameter("@inVar2", adVarChar, adParamInput, 255, "someValue2")
    objCommandSec.parameters.append objCommandSec.createParameter("@outVar1", adVarChar, adParamReturnValue)
    objCommandSec.parameters.append objCommandSec.createParameter("@outVar2", adVarChar, adParamReturnValue)
    objCommandSec.execute , , adExecuteNoRecords
    outVar1 = objCommandSec.parameters("@outVar1").value
    outVar2 = objCommandSec.parameters("@outVar2").value
    
    response.write outVar1
    response.write outVar2
    

    【讨论】:

    • 我试过了 - 我不断收到消息“参数类型错误、超出可接受范围或相互冲突。”参数名称、类型、长度、精度、比例和顺序如下(根据db): @inVar1 int 4 10 0 1 @inVar2 varchar 200 200 NULL 2 @outVar1 int 4 10 0 3 @outVar2 varchar 50 50 NULL 4
    • 因此我使用了以下代码 因此我使用了以下代码 objCommandSec.Parameters.append objCommandSec.CreateParameter("@inVar1",adInteger,adParamInput) objCommandSec.Parameters.append objCommandSec.CreateParameter("@inVar2 ",adVarChar,adParamInput,200, "load_test_10") objCommandSec.Parameters.append objCommandSec.CreateParameter("@outVar1",adInteger,adParamReturnValue) objCommandSec.Parameters.append objCommandSec.CreateParameter("@outVar2",adVarChar,adParamReturnValue, 50)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多