По некоторой фантастической причине я отлаживаю проблему в Классической ASP-странице (по крайней мере 10 лет моей жизни, потерянной за прошлые 2 дня).
Я пытаюсь выполнить хранимую процедуру, которая содержит некоторых параметры. Проблема состоит в том, что один из параметры не заполняются, когда хранимая процедура возвращается. Я могу выполнить сохраненный proc от студии управления 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))
Не работает. Даже немного. (Еще десять лет моей жизни коту под хвост) третий параметр является просто ПУСТЫМ - который является тем, что я испытываю в Классической ASP-странице также.
Кто-то мог пролить некоторый свет на это? Действительно ли я абсолютно ненормален для размышления, что классический код ASP совпал бы с кодом VBScript? Я думаю, что это использует тот же механизм выполнения сценариев и синтаксис, таким образом, я должен быть в порядке, но я не на 100% уверен.
Результат, который я вижу от своего VBScript, совпадает с, я вижу в ASP.
Попробуйте
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
, если вы знаете детали параметра, поскольку он включает возврат к серверу.
Не забудьте установить Направление
на Выход
:
objCommandSec.Parameters(3).Direction = 2
Другое решение здесь.
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