เมื่อเราเรียกขั้นตอนการจัดเก็บของ SQL Server ใน ASP หากเราใช้วัตถุ Adodb.Command เรามักจะใช้รหัสต่อไปนี้:
dim cmd, rs
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = เชื่อมต่อ
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 ไม่แปลการเรียกไปยังกระบวนงานที่เก็บไว้เป็นไวยากรณ์ที่สมบูรณ์ แต่ใช้วิธีการย่อข้างต้น ด้วยวิธีนี้ เมื่อพารามิเตอร์ที่อยู่ตรงกลางหายไป อาจถูกตัดสินผิดเนื่องจากพารามิเตอร์อื่นสูญหายไป การจัดแนวที่ไม่ตรง
จากนั้น ฉันตรวจสอบคุณสมบัติของอ็อบเจ็กต์ Command และเพิ่มประโยคต่อไปนี้:
cmd.NamedParameters = true
ซึ่งหมายความว่าฉันระบุให้ใช้รูปแบบตัวแปรที่มีชื่อชัดเจน จากนั้นฉันก็รันโปรแกรมและพบว่าคำสั่งที่บันทึกในตัวสร้างโปรไฟล์เหตุการณ์กลายเป็น ตอนนี้:
exec TestProc @a = 1, @b = 'b', ...
พารามิเตอร์ข้อผิดพลาดก็ถูกต้องเช่นกัน
ตอนนี้ทุกอย่างเรียบร้อยดี