Ketika kita memanggil prosedur tersimpan SQL Server di ASP, jika kita menggunakan objek Adodb.Command, kita biasanya menggunakan kode berikut:
dim cmd, rs
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = samb
cmd.CommandType = iklanCmdStoredProc
cmd.CommandText = "TestProc"
cmd.Parameters.Tambahkan cmd.CreateParameter("@a" , adInteger, adParamInput, 4, 1)
cmd.Parameters.Tambahkan cmd.CreateParameter("@b" , adVarChar, adParamInput, 50, 'b')
...
set rs = cmd.Execute
Hari ini ketika saya sedang men-debug suatu program, saya menemukan bahwa halaman ASP menunjukkan bahwa parameter tertentu tidak diberi nilai, tetapi sebenarnya itu adalah parameter lain yang tidak saya tetapkan nilainya. Jadi saya membuka profiler Sql Server, menjalankan program, dan menangkap bahwa pernyataan SQL yang dikirim oleh ASP ke Sql Server sebenarnya dalam bentuk berikut:
jalankan TestProc 1, 'b', ....
Alasannya sekarang jelas. Namun, mesin ADO tidak menerjemahkan panggilan ke prosedur tersimpan ke dalam sintaks yang lengkap, tetapi menggunakan metode singkatan di atas, ketika parameter di tengah hilang, parameter tersebut mungkin salah dinilai sebagai parameter lain yang hilang karena ketidakselarasan.
Kemudian saya memeriksa properti objek Command dan menambahkan kalimat berikut:
cmd.NamedParameters = true
, yang berarti saya menentukan untuk menggunakan bentuk variabel yang diberi nama secara eksplisit. Kemudian saya menjalankan program dan menemukan bahwa pernyataan yang ditangkap di profiler acara menjadi Sekarang:
exec TestProc @a = 1, @b = 'b', ...
parameter kesalahan juga benar.
Semuanya baik-baik saja sekarang