動態拼接 SQL 字串時,若變數包含單引號(如 O'Reilly),會導致語法錯誤。非繫結開發模式下極常遇到。
將單引號加倍('')以跳脫:
Function ProcessStr(ByVal str As String) As String
Dim pos As Long
pos = InStr(str, "'")
Do While pos > 0
str = Left(str, pos) & "'" & Mid(str, pos + 1)
pos = InStr(pos + 2, str, "'")
Loop
ProcessStr = str
End Function
缺點:額外 CPU 開銷、易漏處理、防不了 SQL 注入。
使用 ADODB.Command + Parameter 物件,完全避開字串拼接:
Dim cmd As New ADODB.Command
Dim prm As New ADODB.Parameter
cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * FROM employee WHERE fname = ?"
cmd.CommandType = adCmdText
Set prm = cmd.CreateParameter("fname", adVarChar, adParamInput, 50, Combo1.Text)
cmd.Parameters.Append prm
Set rs = cmd.Execute
優點:
| 面向 | 字串跳脫 | 參數化查詢 |
|---|---|---|
| 開發速度 | 快(直接拼字串) | 稍慢(需建立 Parameter) |
| 執行效能 | 較低 | 高(可重複使用執行計畫) |
| 安全性 | 低(易受注入) | 高(資料與程式碼分離) |
| 維護性 | 差 | 佳 |
新專案請直接採用參數化查詢;舊系統若難以大幅重構,可暫時用跳脫函式過渡,但務必規劃改寫時程。