首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server單引號處理兩大技巧:轉義字元與參數化查詢

     編輯:關於SqlServer

問題

動態拼接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開銷、易漏替換、防注入能力弱。

方法二:ADO Command參數化(推薦)

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注入、預編譯執行計畫重用、效能最佳。搭配預存程序更勝一籌。

完整VB範例對照

原文提供完整Form代碼:Command1演示轉義法,Command2演示參數法,結果輸出至MSFlexGrid。資料庫pubs.employee表預置fname = "Paolo''f"與"Paolo'f"測試資料。

最佳實踐總結

  1. **永遠使用參數化查詢**(ADO Command / ADO.NET SqlParameter / 預存程序參數)。
  2. 動態SQL僅作為最後手段,且必須嚴格轉義。
  3. 預存程序 + 參數 = **預編譯計畫重用 + 網路封包縮小 + 安全性最高**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved