我們在ASP 中呼叫SQL Server 的預存程序時,如果使用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 的事件探察器, 執行了一遍程序, 捕捉到實際上ASP 發送給Sql Server 的SQL 語句實際上是如下的形式:
execute TestProc 1, 'b', ....
原因現在很明顯了,ADO 引擎沒有把對預存程序的呼叫翻譯為完整的語法, 而是採用了上述簡寫方式, 這樣,當中間某個參數丟失的時候, 就有可能因為錯位而誤判為另一個參數丟失。
然後我查了一下Command 物件的屬性, 加瞭如下一句:
cmd.NamedParameters = true
也就是說指定要使用顯式命名的變數形式, 然後再執行一邊程序, 發現事件探勘器中捕捉到的語句變成了:
exec TestProc @a = 1, @b = 'b', ...
報錯的參數也是正確的。
Everything is OK now