Lorsque nous appelons la procédure stockée de SQL Server dans ASP, si nous utilisons l'objet Adodb.Command, nous utilisons généralement le code suivant :
dim cmd, rs
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = connexion
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "TestProc"
cmd.Parameters.Append cmd.CreateParameter("@a" , adInteger, adParamInput, 4, 1)
cmd.Parameters.Append cmd.CreateParameter("@b" , adVarChar, adParamInput, 50, 'b')
...
set rs = cmd.Execute
Aujourd'hui, lorsque je débogais un programme, j'ai découvert que la page ASP indiquait qu'un certain paramètre n'avait pas de valeur, mais en fait c'était un autre paramètre auquel je n'avais pas attribué de valeur. J'ai donc ouvert le profileur de Sql Server, exécuté le programme et constaté que l'instruction SQL envoyée par ASP à Sql Server était en fait sous la forme suivante :
exécutez TestProc 1, 'b', ....
La raison est maintenant évidente. Cependant, le moteur ADO ne traduit pas l'appel à la procédure stockée en une syntaxe complète, mais utilise la méthode d'abréviation ci-dessus. De cette façon, lorsqu'un paramètre au milieu est perdu, il peut être mal jugé comme un autre paramètre perdu en raison de la perte d'un autre paramètre. désalignement.
Ensuite, j'ai vérifié les propriétés de l'objet Command et ajouté la phrase suivante :
cmd.NamedParameters = true
, ce qui signifie que je spécifie d'utiliser une forme de variable explicitement nommée. Ensuite, j'ai exécuté le programme et j'ai constaté que l'instruction capturée dans le profileur d'événements devenait. Maintenant :
exec TestProc @a = 1, @b = 'b', ...
les paramètres d'erreur sont également corrects.
Tout va bien maintenant