Выполнить хранимую процедуру из классического ASP - PullRequest
6 голосов
/ 22 апреля 2010

По какой-то фантастической причине я обнаруживаю, что отлаживаю проблему на странице классического ASP (по крайней мере 10 лет моей жизни потеряно за последние 2 дня).

Я пытаюсь выполнить хранимую процедуру,содержит некоторые параметры OUT.Проблема в том, что один из параметров OUT не заполняется, когда хранимая процедура возвращается.Я могу выполнить сохраненный процесс из SQL Management Studio (это 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 

Отлично работает.Фантастика.Отлично.Точные значения, которые я ожидаю, возвращаются и распечатываются.

Верно, поскольку я пытаюсь отладить страницу Classic 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.

Ответы [ 3 ]

10 голосов
/ 22 апреля 2010

Попробуйте

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, если вы знаете подробности параметра, так как он связан с возвращением на сервер.

1 голос
/ 22 апреля 2010

Не забудьте установить Direction на Output:

objCommandSec.Parameters(3).Direction = 2
0 голосов
/ 22 апреля 2010

Другое решение здесь.

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
...