Cuando llamamos al procedimiento almacenado de SQL Server en ASP, si usamos el objeto Adodb.Command, generalmente usamos el siguiente código:
dim cmd, rs
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conexión
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "PruebaProc"
cmd.Parameters.Append cmd.CreateParameter("@a", adInteger, adParamInput, 4, 1)
cmd.Parameters.Append cmd.CreateParameter("@b", adVarChar, adParamInput, 50, 'b')
...
set rs = cmd.Execute
Hoy cuando estaba depurando un programa, encontré que la página ASP indicaba que a cierto parámetro no se le asignó un valor, pero en realidad era otro parámetro al que no le asigné un valor. Entonces abrí el generador de perfiles de Sql Server, ejecuté el programa y capturé que la declaración SQL enviada por ASP a Sql Server tenía en realidad la siguiente forma:
ejecutar TestProc 1, 'b', ....
La razón ahora es obvia. Sin embargo, el motor ADO no traduce la llamada al procedimiento almacenado a una sintaxis completa, sino que utiliza el método de abreviatura anterior. De esta manera, cuando se pierde un parámetro en el medio, se puede juzgar erróneamente como que se pierde otro parámetro debido a. desalineación.
Luego verifiqué las propiedades del objeto Comando y agregué la siguiente oración:
cmd.NamedParameters = true
, lo que significa que especifico usar una forma de variable nombrada explícitamente. Luego ejecuté el programa y descubrí que la declaración capturada en el generador de perfiles de eventos se convirtió. Ahora:
exec TestProc @a = 1, @b = 'b', ...
los parámetros de error también son correctos.
Todo está bien ahora