当前位置: 首页 > 图文教程 > 网络编程 > ASP > SQL Server中单引号的两种处理技巧

ASP
asp调用存储过程
利用批处理文件和 vbs 脚本实现网站视频自动录制
ASP、vbscript编码模板
FileSystem对象常用的文件操作函数有哪些?
asp显示日历效果
sql语句的一些集合
ASP语法注释
函数名称 函数功能
万能数据库连接程序
记录集内随机取记录的代码
分页代码
如何在数据库中用好Transaction?
用Command对象和RecordSet对象向数据库增加记录哪一个更好
为什么在存储过程中用OLEDB方式不能返回记录集
如何查询日期类型的数据?
ASP如何获取真实IP地址
两种小偷程序的比较
使用xmlHttp结合ASP实现网页的异步调用
用ASP开"多线程"
整理了一个editplus的剪辑文件(ASP方面的内容)

ASP 中的 SQL Server中单引号的两种处理技巧


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 111 ::
收藏到网摘: n/a

  和数据库打交道要频繁地用到SQL语句,除非你是全部用控件绑定的方式,但采用控件绑定的方式存在着灵活性差、效率低、功能弱等等缺点。因此,大多数的程序员极少或较少用这种绑定的方式。而采用非绑定方式时许多程序员大都忽略
了对单引号的特殊处理,一旦SQL语句的查询条件的变量有单引号出现,数据库引擎就会报错指出SQL语法不对,本人发现有两种方法可以解决和处理这种单引号的问题(以VB为例子)。

---- 方法一:利用转义字符处理SQL语句。下面的函数可以在执行SQL语句前调用,执行处理后的结果即可产生正确的结
果。

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参数是你的SQL字符串。函数一旦发现字符串中有单引号出现,就在前面补上一个单引号。

---- 方法二:利用数据对象中的参数。可以利用ADODB.COMMAND对象,把含有单引号的字符串传递给COMMAND,然后执行查
询等操作即可。

---- 以上两种方法比较,方法一增加了系统处理时间,方法二简洁、高效,如果采用存储过程,然后再传递参数给存储过
程,存储过程是预编译的,这样系统的效率更高。

---- 下面就举例子加以说明。

---- 新建一个项目,项目中有一个窗体(Form1),两个命令按钮,一个MSFlexGrid,名称分别为:Command1,
Command2,MSFlexGrid1,一个COMBOX(COMBO1),它的内容预先设定为"Paolo''f"、"Paolo'f"。Command1演示方法一,
Command2演示方法二,MSFlexGrid1存储方法二查询(SELECT)结果。对于其他的SQL操作(INSERT、DELTER、UPDATAE)方法
极为类似,笔者就不再赘述。例子中用到SQL SERVER中的PUBS数据库中的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'
---- 程序如下:

---- 首先把前面的函数加入。

---- 在窗体的通用中声明如下变量:

Dim cnn1 As ADODB.Connection  '连接
Dim mycommand As ADODB.Command '命令
Dim rstByQuery As ADODB.Recordset '结果集
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" '
没有系统数据源使用连接字符串
   
'strCnn = "DSN=mydsn;UID=sa;PWD=;"
'DATABASE=pubs;Driver={SQL Server};SERVER=gzl_pc" '
如果系统数据源MYDSN指向PUBS数据库,也可以这样用
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 的当前活动连接
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
i = i + 1    '  i 中保存记录个数
rstByQuery.MoveNext
Loop
MSFlexGrid1.Rows = i + 1  '动态设置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   '设置第一行的标题,用域名填充

i = 0
'Set rstByQuery = mycommand.Execute()
rstByQuery.Requery
Do While Not rstByQuery.EOF
  i = i + 1
  MSFlexGrid1.Row = i  '确定行
  For j = 0 To rstByQuery.Fi