عندما نستدعي الإجراء المخزن لـ SQL Server في ASP، إذا استخدمنا كائن Adodb.Command، فعادةً ما نستخدم التعليمة البرمجية التالية:
dim cmd, rs
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
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
اليوم عندما كنت أقوم بتصحيح أخطاء أحد البرامج، وجدت أن صفحة ASP تشير إلى أنه لم يتم تعيين قيمة لمعلمة معينة، ولكنها في الواقع كانت معلمة أخرى لم أقم بتعيين قيمة لها. لذلك فتحت ملف التعريف الخاص بـ Sql Server، وقمت بتنفيذ البرنامج، ولاحظت أن عبارة SQL التي أرسلها ASP إلى Sql Server كانت في الواقع بالشكل التالي:
تنفيذ TestProc 1, 'b', ....
والسبب واضح الآن. ومع ذلك، فإن محرك ADO لا يترجم استدعاء الإجراء المخزن إلى بناء جملة كامل، ولكنه يستخدم طريقة الاختصار المذكورة أعلاه، وبهذه الطريقة، عند فقدان معلمة في المنتصف، قد يتم الحكم عليها بشكل خاطئ بسبب فقدان معلمة أخرى اختلال.
ثم قمت بالتحقق من خصائص كائن الأمر وأضفت الجملة التالية:
cmd.NamedParameters = true
، مما يعني أنني أحدد استخدام نموذج متغير مسمى بشكل صريح، ثم قمت بتنفيذ البرنامج ووجدت أن العبارة التي تم التقاطها في ملف تعريف الحدث أصبحت الآن:
exec TestProc @a = 1, @b = 'b',...
معلمات الخطأ صحيحة أيضًا.
كل شيء على ما يرام الآن