SQL Server單引號的2種處理方案
以下的文章主要描述的是SQL Server單引號的2種處理方案,我們大家在實(shí)際操作中和數(shù)據(jù)庫打交道時,SQL語句的使用頻率是非常高的,當(dāng)然你也可以是全部用控件綁定的方式,但采用控件綁定的方式存在著靈活性差、效率低、功能弱等等缺點(diǎn)。
因此,大多數(shù)的程序員極少或較少用這種綁定的方式。而采用非綁定方式時許多程序員大都忽略了對SQL Server單引號的特殊處理,一旦SQL語句的查詢條件的變量有單引號出現(xiàn),數(shù)據(jù)庫引擎就會報錯指出SQL語法不對,本人發(fā)現(xiàn)有兩種方法可以解決和處理這種SQL Server單引號的問題(以VB為例子)。
SQL Server單引號處理技巧方法一:
利用轉(zhuǎn)義字符處理SQL語句。下面的函數(shù)可以在執(zhí)行SQL語句前調(diào)用,執(zhí)行處理后的結(jié)果即可產(chǎn)生正確的結(jié)果。
- Function ProcessStr(str As String) Dim pos As Integer Dim 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
其中str參數(shù)是你的SQL字符串。函數(shù)一旦發(fā)現(xiàn)字符串中有SQL Server單引號出現(xiàn),就在前面補(bǔ)上一個單引號。
SQL Server單引號處理技巧方法二:
利用數(shù)據(jù)對象中的參數(shù)??梢岳肁DODB.COMMAND對象,把含有單引號的字符串傳遞給COMMAND,然后執(zhí)行查詢等操作即可。
以上兩種方法比較,方法一增加了系統(tǒng)處理時間,方法二簡潔、高效,如果采用存儲過程,然后再傳遞參數(shù)給存儲過程,存儲過程是預(yù)編譯的,這樣系統(tǒng)的效率更高。
下面就舉例子加以說明。
新建一個項(xiàng)目,項(xiàng)目中有一個窗體(Form1),兩個命令按鈕,一個MSFlexGrid,名稱分別為:Command1,Command2,MSFlexGrid1,一個COMBOX(COMBO1),它的內(nèi)容預(yù)先設(shè)定為“Paolo'f”、“Paolo'f”。Command1演示方法一,Command2演示方法二,MSFlexGrid1存儲方法二查詢(SELECT)結(jié)果。
對于其他的SQL操作(INSERT、DELTER、UPDATAE)方法極為類似,筆者就不再贅述。例子中用到SQL SERVER中的PUBS數(shù)據(jù)庫中的EMPLOYEE表,同時可以用SQL語法把其中兩條記錄中的FNAME改為“Paolo''f”、“Paolo'f”。 SQL語法如下:
- update employee set fname=" Paolo''''f" where emp_id='PMA42628M' update employee set fname=" Paolo''f" where emp_id='PMA42628M'
程序如下:
首先把前面的函數(shù)加入。在窗體的通用中聲明如下變量:
- Dim cnn1 As ADODB.Connection '連接 Dim mycommand As ADODB.Command '命令
- Dim rstByQuery As ADODB.Recordset '結(jié)果集 Dim strCnn As String '連接字符串
- Private Sub Form_Load() Set cnn1 = New ADODB.Connection '生成一個連接
- strCnn = "driver={SQL Server};" & _ "server=ZYX_pc;uid=sa;pwd=PCDC;database=pubs" '
- 沒有系統(tǒng)數(shù)據(jù)源使用連接字符串 'strCnn = "DSN=mydsn;UID=sa;PWD=;" 'DATABASE=pubs;
- Driver={SQL Server};SERVER=gzl_pc" ' 如果系統(tǒng)數(shù)據(jù)源MYDSN指向PUBS數(shù)據(jù)庫,
- 也可以這樣用 cnn1.Open strCnn, , , 0 '打開連接 End Sub Private Sub Command1_Click() '
- 演示字符處理 Dim i As Integer Dim j As Integer Set parm = New ADODB.
- Parameter Set mycommand = New ADODB.Command Dim str As String str = Combo1.
- Text str = ProcessStr (str) mycommand.ActiveConnection = cnn1 '
- 指定該command 的當(dāng)前活動連接 mycommand.CommandText = " select * from employee
- where fname = '" & str & "'" mycommand.CommandType = adCmdText '表明command 類型
- Set rstByQuery = New ADODB.Recordset Set rstByQuery = mycommand.Execute() i = 0 Do
- While Not rstByQuery.EOF ii = i + 1 ' i 中保存記錄個數(shù) rstByQuery.MoveNext Loop MSFlexGrid1.
- Rows = i + 1 '動態(tài)設(shè)置MSFlexGrid的行和列 MSFlexGrid1.Cols = rstByQuery.Fields.count + 1
- MSFlexGrid1.Row = 0 For i = 0 To rstByQuery.Fields.count - 1 MSFlexGrid1.Col = i + 1
- MSFlexGrid1.Text = rstByQuery.Fields.Item(i).Name Next '設(shè)置第一行的標(biāo)題,用域名填充 i = 0 '
- Set rstByQuery = mycommand.Execute() rstByQuery.Requery Do While Not rstByQuery.EOF ii
- = i + 1 MSFlexGrid1.Row = i '確定行 For j = 0 To rstByQuery.Fields.count - 1 MSFlexGrid1.
- Col = j + 1 MSFlexGrid1.Text = rstByQuery(j) '添充所有的列 Next rstByQuery.MoveNext Loop '
- 這個循環(huán)用來填充MSFlexGrid的內(nèi)容 End Sub Private Sub Command2_Click()'參數(shù)方法 Dim i As
- Integer Dim j As Integer Set parm = New ADODB.Parameter Set mycommand = New ADODB.
- Command ' parm_jobid.Name = "name1" this line can be ommited parm.Type = adChar '
- 參數(shù)類型 parm.Size = 10 '參數(shù)長度 parm.Direction = adParamInput '參數(shù)方向,輸入或輸出
- parm.Value = Combo1.Text '參數(shù)的值 mycommand.Parameters.Append parm '加入?yún)?shù) mycommand.ActiveConnection =
cnn1 ' 指定該command 的當(dāng)前活動連接 mycommand.CommandText = " select * from employee where fname =? " mycommand.- CommandType = adCmdText '表明command 類型 Set rstByQuery = New ADODB.Recordset
- Set rstByQuery = mycommand.Execute() i = 0 Do While Not rstByQuery.EOF ii = i + 1 ' i
- 中保存記錄個數(shù) rstByQuery.MoveNext Loop MSFlexGrid1.Rows = i + 1 '動態(tài)設(shè)置MSFlexGrid的
- 行和列 MSFlexGrid1.Cols = rstByQuery.Fields.count + 1 MSFlexGrid1.Row = 0 For i = 0 To
- rstByQuery.Fields.count - 1 MSFlexGrid1.Col = i + 1 MSFlexGrid1.Text = rstByQuery.
- Fields.Item(i).Name Next '設(shè)置第一行的標(biāo)題,用域名填充 i = 0 rstByQuery.Requery Do
- While Not rstByQuery.EOF ii = i + 1 MSFlexGrid1.Row = i '確定行 For j = 0 To rstByQuery.
- Fields.count - 1 MSFlexGrid1.Col = j + 1 MSFlexGrid1.Text = rstByQuery(j) '添充所有的列
- Next rstByQuery.MoveNext Loop '這個循環(huán)用來填充MSFlexGrid的內(nèi)容 End Sub
查詢部分可以用存儲過程以提高處理效率,減低網(wǎng)絡(luò)流量。本程序在NT WORKSTATION 4.0 SP4、SQL SERVER 7.0 上調(diào)試通過,上述的相關(guān)內(nèi)容就是對SQL Server單引號處理技巧的描述,希望會給你帶來一些幫助在此方面。
【編輯推薦】