Adodb.Command 平時(shí)很少注意到的一個(gè)參數(shù)
發(fā)表時(shí)間:2024-06-07 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]我們在 ASP 中調(diào)用 SQL Server 的存儲過程時(shí),如果使用 Adodb.Command 對象,通常使用如下的代碼:dim cmd, rsset cmd = Server.CreateObject("ADODB.Command")cmd.ActiveConnection...
我們在 ASP 中調(diào)用 SQL Server 的存儲過程時(shí),如果使用 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
今天我在調(diào)試一個(gè)程序的時(shí)候發(fā)現(xiàn), ASP 頁面上提示某個(gè)參數(shù)沒有賦值, 而實(shí)際上我沒賦值的卻是另一個(gè)參數(shù)。 于是我打開 Sql Server 的事件探察器, 執(zhí)行了一遍程序, 捕捉到實(shí)際上 ASP 發(fā)送給 Sql Server 的 SQL 語句實(shí)際上是如下的形式:
execute TestProc 1, 'b', ....
原因現(xiàn)在很明顯了,ADO 引擎沒有把對存儲過程的調(diào)用翻譯為完整的語法, 而是采用了上述簡寫方式, 這樣,當(dāng)中間某個(gè)參數(shù)丟失的時(shí)候, 就有可能因?yàn)殄e(cuò)位而誤判為另一個(gè)參數(shù)丟失。
然后我查了一下 Command 對象的屬性, 加了如下一句:
cmd.NamedParameters = true
也就是說指定要使用顯式命名的變量形式, 然后再執(zhí)行一邊程序, 發(fā)現(xiàn)事件探察器中捕捉到的語句變成了:
exec TestProc @a = 1, @b = 'b', ...
報(bào)錯(cuò)的參數(shù)也是正確的。
Everything is OK now