拼接 SQL 字符串時,變量含單引號會導致語法錯誤。本文對比兩種修復方案。
在單引號前再加一個單引號(SQL Server 標準轉義):
Function ProcessStr(str As String)
Dim pos As Integer, stedest As String
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
調用:sql = "SELECT * FROM t WHERE name = '" & ProcessStr(userInput) & "'"
缺點:增加 CPU 開銷,且易漏轉義導致注入風險。
使用 ? 佔位符,將值綁定到參數對象:
Set cmd = New ADODB.Command Set param = New ADODB.Parameter param.Type = adChar param.Size = 10 param.Direction = adParamInput param.Value = userInput ' 含單引號也安全 cmd.Parameters.Append param cmd.ActiveConnection = conn cmd.CommandText = "SELECT * FROM employee WHERE fname = ?" cmd.CommandType = adCmdText Set rs = cmd.Execute()
| 維度 | 轉義函數 | 參數化查詢 |
|---|---|---|
| 性能 | 每次拼接解析 | 預編譯,重複執行極快 |
| 安全性 | 依賴開發者調用 | 原生防注入,無法繞過 |
| 代碼維護 | SQL 與數據混雜 | 結構與數據分離 |
將邏輯封裝為預編譯存儲過程,應用層僅傳參數,網絡流量最小、執行計劃複用率最高,是企業級開發首選模式。
文中包含雙按鈕演示項目(Form1 + MSFlexGrid + ComboBox),可直接運行對比效果。環境:NT 4.0 SP4 + SQL Server 7.0 + PUBS 示例庫。