動態拼接 SQL 字串時,變數值包含單引號 (如 O'Brien) 會導致語法錯誤:WHERE name = 'O'Brien' → 錯誤。必須將單引號**加倍轉義**為 '':WHERE name = 'O''Brien'。
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
' 使用
Dim sql As String
sql = "SELECT * FROM employee WHERE fname = '" & ProcessStr(Combo1.Text) & "'"
Dim cmd As New ADODB.Command
Dim prm As New ADODB.Parameter
Dim rs As New ADODB.Recordset
cmd.ActiveConnection = cnn1
cmd.CommandText = "SELECT * FROM employee WHERE fname = ?" -- 參數佔位符
cmd.CommandType = adCmdText
prm.Type = adVarChar
prm.Size = 50
prm.Direction = adParamInput
prm.Value = Combo1.Text -- 直接傳值,無需轉義
cmd.Parameters.Append prm
Set rs = cmd.Execute
' ... 繫結 rs 到 Grid
cmd.CommandText = "usp_GetEmployeeByName"
cmd.CommandType = adCmdStoredProc
' 參數同前,名稱對應 SP 參數名
預存程序預編譯、計畫快取、權限隔離,**企業級開發標準配置**。
結論:**棄用字串拼接,全面採用參數化查詢**。現代 .NET (SqlParameter)、Java (PreparedStatement)、Python (paramstyle) 皆同理。舊專案重構時,優先替換高風險動態 SQL 模組。