MS-SQL Server 中單引號的兩種處理方法
發(fā)布日期:2022-02-04 14:17 | 文章來源:站長之家
----方法一:利用轉(zhuǎn)義字符處理SQL語句。下面的函數(shù)可以在執(zhí)行SQL語句前調(diào)用,執(zhí)行處理后的結(jié)果即可產(chǎn)生正確的結(jié)果。
----方法二:利用數(shù)據(jù)對象中的參數(shù)。可以利用ADODB.COMMAND對象,把含有單引號的字符串傳遞給COMMAND,然后執(zhí)行查詢等操作即可。 ----以上兩種方法比較,方法一增加了系統(tǒng)處理時間,方法二簡潔、高效,如果采用存儲過程,然后再傳遞參數(shù)給存儲過程,存儲過程是預編譯的,這樣系統(tǒng)的效率更高。 ----下面就舉例子加以說明。 ----新建一個項目,項目中有一個窗體(Form1),兩個命令按鈕,一個MSFlexGrid,名稱分別為:Command1,Command2,MSFlexGrid1,一個COMBOX(COMBO1),它的內(nèi)容預先設定為“Paolo''f“、“Paolo'f“。Command1演示方法一,Command2演示方法二,MSFlexGrid1存儲方法二查詢(SELECT)結(jié)果。對于其他的SQL操作(INSERT、DELTER、UPDATAE)方法極為類似,筆者就不再贅述。例子中用到SQLSERVER中的PUBS數(shù)據(jù)庫中的EMPLOYEE表,同時可以用SQL語法把其中兩條記錄中的FNAME改為“Paolo''f“、“Paolo'f“。SQL語法如下: updateemployeesetfname=“Paolo''''f“
whereemp_id='PMA42628M'
updateemployeesetfname=“Paolo''f“
whereemp_id='PMA42628M' ----程序如下:
----首先把前面的函數(shù)加入。 ----在窗體的通用中聲明如下變量: Dimcnn1AsADODB.Connection'連接
DimmycommandAsADODB.Command'命令
DimrstByQueryAsADODB.Recordset'結(jié)果集
DimstrCnnAsString'連接字符串
PrivateSubForm_Load()
Setcnn1=NewADODB.Connection'生成一個連接
strCnn=“driver={SQLServer};“&_
“server=ZYX_pc;uid=sa;pwd=PCDC;database=pubs“'
沒有系統(tǒng)數(shù)據(jù)源使用連接字符串 'strCnn=“DSN=mydsn;UID=sa;PWD=;“
'DATABASE=pubs;Driver={SQLServer};SERVER=gzl_pc“'
如果系統(tǒng)數(shù)據(jù)源MYDSN指向PUBS數(shù)據(jù)庫,也可以這樣用
cnn1.OpenstrCnn,,,0'打開連接
EndSub
PrivateSubCommand1_Click()'演示字符處理
DimiAsInteger
DimjAsInteger
Setparm=NewADODB.Parameter
Setmycommand=NewADODB.Command DimstrAsString
str=Combo1.Text
str=ProcessStr(str)
mycommand.ActiveConnection=cnn1'
指定該command的當前活動連接
mycommand.CommandText=“select*from
employeewherefname='“&str&“'“
mycommand.CommandType=adCmdText'表明command類型
SetrstByQuery=NewADODB.Recordset
SetrstByQuery=mycommand.Execute()
i=0
DoWhileNotrstByQuery.EOF
i=i+1'i中保存記錄個數(shù)
rstByQuery.MoveNext
Loop
MSFlexGrid1.Rows=i+1'動態(tài)設置MSFlexGrid的行和列
MSFlexGrid1.Cols=rstByQuery.Fields.count+1
MSFlexGrid1.Row=0
Fori=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=i+1
MSFlexGrid1.Text=rstByQuery.Fields.Item(i).Name
Next'設置第一行的標題,用域名填充 i=0
'SetrstByQuery=mycommand.Execute()
rstByQuery.Requery
DoWhileNotrstByQuery.EOF
i=i+1
MSFlexGrid1.Row=i'確定行
Forj=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=j+1
MSFlexGrid1.Text=rstByQuery(j)'添充所有的列
Next
rstByQuery.MoveNext Loop'這個循環(huán)用來填充MSFlexGrid的內(nèi)容
EndSub
PrivateSubCommand2_Click()'參數(shù)方法
DimiAsInteger
DimjAsInteger Setparm=NewADODB.Parameter
Setmycommand=NewADODB.Command 'parm_jobid.Name=“name1“thislinecanbeommited
parm.Type=adChar'參數(shù)類型
parm.Size=10'參數(shù)長度
parm.Direction=adParamInput'參數(shù)方向,輸入或輸出
parm.Value=Combo1.Text'參數(shù)的值
mycommand.Parameters.Appendparm'加入?yún)?shù)
mycommand.ActiveConnection=cnn1'
指定該command的當前活動連接
mycommand.CommandText=“select*
fromemployeewherefname=?“
mycommand.CommandType=adCmdText'表明command類型
SetrstByQuery=NewADODB.Recordset
SetrstByQuery=mycommand.Execute()
i=0
DoWhileNotrstByQuery.EOF
i=i+1'i中保存記錄個數(shù)
rstByQuery.MoveNext
Loop
MSFlexGrid1.Rows=i+1'動態(tài)設置MSFlexGrid的行和列
MSFlexGrid1.Cols=rstByQuery.Fields.count+1
MSFlexGrid1.Row=0
Fori=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=i+1
MSFlexGrid1.Text=rstByQuery.Fields.Item(i).Name
Next'設置第一行的標題,用域名填充 i=0
rstByQuery.Requery
DoWhileNotrstByQuery.EOF
i=i+1
MSFlexGrid1.Row=i'確定行
Forj=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=j+1
MSFlexGrid1.Text=rstByQuery(j)'添充所有的列
Next
rstByQuery.MoveNext Loop'這個循環(huán)用來填充MSFlexGrid的內(nèi)容
EndSub ----查詢部分可以用存儲過程以提高處理效率,減低網(wǎng)絡流量。
----本程序在NTWORKSTATION4.0SP4、SQLSERVER7.0上調(diào)試通過
復制代碼 代碼如下:
FunctionProcessStr(strAsString)
DimposAsInteger
DimstedestAsString
pos=InStr(str,“'“) Whilepos〉0
str=Mid(str,1,pos)&“'“&Mid(str,pos+1)
pos=InStr(pos+2,str,“'“)
Wend
ProcessStr=str
EndFunction
----其中str參數(shù)是你的SQL字符串。函數(shù)一旦發(fā)現(xiàn)字符串中有單引號出現(xiàn),就在前面補上一個單引號。
DimposAsInteger
DimstedestAsString
pos=InStr(str,“'“) Whilepos〉0
str=Mid(str,1,pos)&“'“&Mid(str,pos+1)
pos=InStr(pos+2,str,“'“)
Wend
ProcessStr=str
EndFunction
----方法二:利用數(shù)據(jù)對象中的參數(shù)。可以利用ADODB.COMMAND對象,把含有單引號的字符串傳遞給COMMAND,然后執(zhí)行查詢等操作即可。 ----以上兩種方法比較,方法一增加了系統(tǒng)處理時間,方法二簡潔、高效,如果采用存儲過程,然后再傳遞參數(shù)給存儲過程,存儲過程是預編譯的,這樣系統(tǒng)的效率更高。 ----下面就舉例子加以說明。 ----新建一個項目,項目中有一個窗體(Form1),兩個命令按鈕,一個MSFlexGrid,名稱分別為:Command1,Command2,MSFlexGrid1,一個COMBOX(COMBO1),它的內(nèi)容預先設定為“Paolo''f“、“Paolo'f“。Command1演示方法一,Command2演示方法二,MSFlexGrid1存儲方法二查詢(SELECT)結(jié)果。對于其他的SQL操作(INSERT、DELTER、UPDATAE)方法極為類似,筆者就不再贅述。例子中用到SQLSERVER中的PUBS數(shù)據(jù)庫中的EMPLOYEE表,同時可以用SQL語法把其中兩條記錄中的FNAME改為“Paolo''f“、“Paolo'f“。SQL語法如下: updateemployeesetfname=“Paolo''''f“
whereemp_id='PMA42628M'
updateemployeesetfname=“Paolo''f“
whereemp_id='PMA42628M' ----程序如下:
----首先把前面的函數(shù)加入。 ----在窗體的通用中聲明如下變量: Dimcnn1AsADODB.Connection'連接
DimmycommandAsADODB.Command'命令
DimrstByQueryAsADODB.Recordset'結(jié)果集
DimstrCnnAsString'連接字符串
PrivateSubForm_Load()
Setcnn1=NewADODB.Connection'生成一個連接
strCnn=“driver={SQLServer};“&_
“server=ZYX_pc;uid=sa;pwd=PCDC;database=pubs“'
沒有系統(tǒng)數(shù)據(jù)源使用連接字符串 'strCnn=“DSN=mydsn;UID=sa;PWD=;“
'DATABASE=pubs;Driver={SQLServer};SERVER=gzl_pc“'
如果系統(tǒng)數(shù)據(jù)源MYDSN指向PUBS數(shù)據(jù)庫,也可以這樣用
cnn1.OpenstrCnn,,,0'打開連接
EndSub
PrivateSubCommand1_Click()'演示字符處理
DimiAsInteger
DimjAsInteger
Setparm=NewADODB.Parameter
Setmycommand=NewADODB.Command DimstrAsString
str=Combo1.Text
str=ProcessStr(str)
mycommand.ActiveConnection=cnn1'
指定該command的當前活動連接
mycommand.CommandText=“select*from
employeewherefname='“&str&“'“
mycommand.CommandType=adCmdText'表明command類型
SetrstByQuery=NewADODB.Recordset
SetrstByQuery=mycommand.Execute()
i=0
DoWhileNotrstByQuery.EOF
i=i+1'i中保存記錄個數(shù)
rstByQuery.MoveNext
Loop
MSFlexGrid1.Rows=i+1'動態(tài)設置MSFlexGrid的行和列
MSFlexGrid1.Cols=rstByQuery.Fields.count+1
MSFlexGrid1.Row=0
Fori=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=i+1
MSFlexGrid1.Text=rstByQuery.Fields.Item(i).Name
Next'設置第一行的標題,用域名填充 i=0
'SetrstByQuery=mycommand.Execute()
rstByQuery.Requery
DoWhileNotrstByQuery.EOF
i=i+1
MSFlexGrid1.Row=i'確定行
Forj=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=j+1
MSFlexGrid1.Text=rstByQuery(j)'添充所有的列
Next
rstByQuery.MoveNext Loop'這個循環(huán)用來填充MSFlexGrid的內(nèi)容
EndSub
PrivateSubCommand2_Click()'參數(shù)方法
DimiAsInteger
DimjAsInteger Setparm=NewADODB.Parameter
Setmycommand=NewADODB.Command 'parm_jobid.Name=“name1“thislinecanbeommited
parm.Type=adChar'參數(shù)類型
parm.Size=10'參數(shù)長度
parm.Direction=adParamInput'參數(shù)方向,輸入或輸出
parm.Value=Combo1.Text'參數(shù)的值
mycommand.Parameters.Appendparm'加入?yún)?shù)
mycommand.ActiveConnection=cnn1'
指定該command的當前活動連接
mycommand.CommandText=“select*
fromemployeewherefname=?“
mycommand.CommandType=adCmdText'表明command類型
SetrstByQuery=NewADODB.Recordset
SetrstByQuery=mycommand.Execute()
i=0
DoWhileNotrstByQuery.EOF
i=i+1'i中保存記錄個數(shù)
rstByQuery.MoveNext
Loop
MSFlexGrid1.Rows=i+1'動態(tài)設置MSFlexGrid的行和列
MSFlexGrid1.Cols=rstByQuery.Fields.count+1
MSFlexGrid1.Row=0
Fori=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=i+1
MSFlexGrid1.Text=rstByQuery.Fields.Item(i).Name
Next'設置第一行的標題,用域名填充 i=0
rstByQuery.Requery
DoWhileNotrstByQuery.EOF
i=i+1
MSFlexGrid1.Row=i'確定行
Forj=0TorstByQuery.Fields.count-1
MSFlexGrid1.Col=j+1
MSFlexGrid1.Text=rstByQuery(j)'添充所有的列
Next
rstByQuery.MoveNext Loop'這個循環(huán)用來填充MSFlexGrid的內(nèi)容
EndSub ----查詢部分可以用存儲過程以提高處理效率,減低網(wǎng)絡流量。
----本程序在NTWORKSTATION4.0SP4、SQLSERVER7.0上調(diào)試通過
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章