Asp classic 从经典ASP.NET执行存储过程
出于某种奇妙的原因,我发现自己正在调试一个经典ASP页面中的一个问题(在过去的两天里,我至少失去了10年的生命) 我正在尝试执行一个包含一些OUT参数的存储过程。问题在于,当存储过程返回时,其中一个OUT参数没有被填充。我可以从sqlmanagementstudio(这是2008年)执行存储过程,所有的值都按照预期设置和返回Asp classic 从经典ASP.NET执行存储过程,asp-classic,vbscript,Asp Classic,Vbscript,出于某种奇妙的原因,我发现自己正在调试一个经典ASP页面中的一个问题(在过去的两天里,我至少失去了10年的生命) 我正在尝试执行一个包含一些OUT参数的存储过程。问题在于,当存储过程返回时,其中一个OUT参数没有被填充。我可以从sqlmanagementstudio(这是2008年)执行存储过程,所有的值都按照预期设置和返回 declare @inVar1 varchar(255) declare @inVar2 varchar(255) declare @outVar1 varchar(255
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))
不起作用。一点也不。(我又过了十年白白浪费的生活)第三个参数是空的——这也是我在经典ASP页面中体验到的
有人能解释一下吗?我认为经典的ASP代码与VBScript代码是一样的,这真是愚蠢透顶吗?我认为它使用相同的脚本引擎和语法,所以我应该可以,但我不是100%确定
我在VBScript中看到的结果与在ASP中看到的结果相同。不要忘记将
方向设置为:
另一个解决办法是在这里
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
试一试
如果您知道参数详细信息,还应避免.Refresh
,因为它涉及返回服务器的过程。刷新调用不应该自动执行此操作吗?不管怎么说,这没有什么区别。我试过了——我一直收到这样的信息:“参数类型错误,超出了可接受的范围,或者相互冲突。”参数名称、类型、长度、精度、比例和顺序如下(根据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),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)返回值仍然为空:-(这对我有用:(来自a.VBS)下一步你可能会在错误恢复后运行这个吗?这个例子对我很有用,但是如果我修改了存储过程中变量的类型,它就不起作用了-你如何访问我发布在那里的变量?哇,实际的问题是存储过程的权限,但是你的例子帮助我解决了这个问题。谢谢你,类型是adinteger(3)代替advarchar(200),大小为4(32位整数中的4个字节),因此;.Parameters.Append.CreateParameter(“@inVar1”,3,1,4,123456)。Parameters.Append.CreateParameter(“@outVar1”,3,2,4)
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
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