2013年7月15日 星期一

ADODB 的 Command.parameters 的吊詭!

程式存取資料庫建議使用 Prepare 方式來傳遞參數,所以一般會將查詢敘述寫成:
dim sql as string = "Insert myTable(fName1 ,fName2 ,fName3) values(?, ?, ?)"
三個 ? 對應到三個要傳遞進來的參數,所以會用下列方法來準備參數

Dim cmd As New ADODB.Command
cmd.CommandText = sql
With cmd
       .Parameters.Append(cmd.CreateParameter("fName1", ADODB.DataTypeEnum.adVarChar, , 50))
       .Parameters.Append(cmd.CreateParameter("fName2", ADODB.DataTypeEnum.adVarChar, , 50))
       .Parameters.Append(cmd.CreateParameter("fName3", ADODB.DataTypeEnum.adVarChar, , 50))
       .Parameters("fName1").value= "value1"
       .Parameters("fName2").value= "value2"
       .Parameters("fName3").value= "value3"
End With
cmd.Execute()

上面的程式看起來似乎沒有什麼問題,可是執行時卻會出現,因為參數的個數不相符。

可是將
dim sql as string = "Insert myTable(fName1 ,fName2 ,fName3) values(?, ?, ?)"
換成
dim sql as string = "Insert myTable(fName1 ,fName2 ,fName3) values(@fName1, @fName2, @fName3)"
就沒有問題了!

從上面的實驗得知,當參數位置使用「?」時,系統會自動為它建立一組 parameter,
可是用「@fname1」方式時卻不會!

故如果用「?」來準備參數,必要時需利用 .parameters.delete(index) 方法先將系統預留的參數區清除!

沒有留言:

張貼留言