動態拼接SQL字串時,變數含單引號(如O'Brien)會導致語法錯誤。非綁定方式開發常見,控件綁定雖免此患但靈活性差、效能低。
Function ProcessStr(str As String) As String
Dim pos As Integer
pos = InStr(str, "'")
While pos > 0
str = Mid(str, 1, pos) & "'" & Mid(str, pos + 1) -- 單引號前插入單引號
pos = InStr(pos + 2, str, "'")
Wend
ProcessStr = str
End Function
-- 使用
Dim sql As String
sql = "SELECT * FROM employee WHERE fname = '" & ProcessStr(Combo1.Text) & "'"
缺點:額外CPU開銷、易漏替換、防注入能力弱。
Dim cmd As New ADODB.Command, prm As New ADODB.Parameter
Set cmd.ActiveConnection = cnn1
cmd.CommandText = "SELECT * FROM employee WHERE fname = ?"
cmd.CommandType = adCmdText
Set prm = cmd.CreateParameter(, adChar, adParamInput, 10, Combo1.Text)
cmd.Parameters.Append prm
Set rs = cmd.Execute()
優點:完全隔離代碼與資料、防SQL注入、預編譯執行計畫重用、效能最佳。搭配預存程序更勝一籌。
原文提供完整Form代碼:Command1演示轉義法,Command2演示參數法,結果輸出至MSFlexGrid。資料庫pubs.employee表預置fname = "Paolo''f"與"Paolo'f"測試資料。