Когда мы вызываем хранимую процедуру SQL Server в ASP и используем объект Adodb.Command, мы обычно используем следующий код:
dim cmd, rs
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = подключение
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "Тестовый процесс"
cmd.Parameters.Append cmd.CreateParameter("@a" , adInteger, adParamInput, 4, 1)
cmd.Parameters.Append cmd.CreateParameter("@b" , adVarChar, adParamInput, 50, 'b')
...
set rs = cmd.Execute
Сегодня, когда я отлаживал программу, я обнаружил, что на странице ASP указано, что определенному параметру не присвоено значение, но на самом деле это был другой параметр, которому я не присвоил значение. Итак, я открыл профилировщик Sql Server, выполнил программу и зафиксировал, что оператор SQL, отправленный ASP на Sql Server, на самом деле имел следующую форму:
выполнить TestProc 1, 'b', ....
Причина теперь очевидна. Однако механизм ADO не преобразует вызов хранимой процедуры в полный синтаксис, а использует описанный выше метод сокращения. Таким образом, когда параметр в середине потерян, он может быть ошибочно воспринят как другой параметр, потерянный из-за потери. несоосность.
Затем я проверил свойства объекта Command и добавил следующее предложение:
cmd.NamedParameters = true
, что означает, что я указываю использование явно именованной формы переменной. Затем я запустил программу и обнаружил, что оператор, записанный в профилировщике событий, стал. Теперь:
exec TestProc @a = 1, @b = 'b', ...
параметры ошибки также верны.
Теперь все в порядке