转义字符起引的“missing right parenthesis”错误

  大熊最近在给一个MIS系统作数据库优化。这个系统采用的是ASP+IIS+ORACLE架构,主要的优化目标就是用存储过程代替查询缓慢的视图。经过一番坚持不懈的努力,大熊终于把存储过程给搞定,满以为世界即将变得美好的时候,ASP页面报了错,说:ORA-00907: missing right parenthesis. Fiant,明明在SQL Tools里面可以很好运行的,怎么到了ASP里面就始终无法正常工作呢?
  在经过无数次的测试与修改都无法解决问题之后,大熊觉得就要绝望和放弃了。突然,峰回路转的时候出现了,大熊在无意间注释了一行SQL的转义语句后,ASP页面竟然正常运作了起来。
  What's Wrong?经过一番分析,大熊得出如下的结论:
  我们知道在SQL中单撇号(')是用来标识字符串的,如果字符串中出现了单撇号,则必须同时打两个单撇号(''),通过转义的方式来实现单撇号的保存。
  这个MIS系统的ASP是采用OLEDB的方式来连接Oracle数据库的,在这种模式下执行存储过程有两种方式,一种是连接对象的直接SQL执行:
conn.Execute("exec proc_get_list('aa','bb');")
可以看到这里面如果出现了单撇号,肯定是要在ASP进行一次转换再执行的:
conn.Execute("exec proc_get_list('aa', '"& Replace("b'b""'""''"&"')")
这样,存储过程才可以正常执行。
  还有一种方式是使用命令(Command)对象,MIS系统用的就是这种方式:
' sqlList = Replace(sqlList, "'", "''")
set oCmdDisp = Server.CreateObject("Adodb.Command")             ' 命令对象
set oCmdDisp.ActiveConnection = conn
oCmdDisp.CommandText 
= "{call PROC_GET_PHONIST_STATUS_LIST(?,?,?)}"
oCmdDisp.CommandType 
= adCmdText
oCmdDisp.Parameters.Append oCmdDisp.CreateParameter(
"condition_string", adVarChar, adParamInput, 500, sqlList)
oCmdDisp.Parameters.Append oCmdDisp.CreateParameter(
"curr_page", adInteger, adParamInput, 10Clng(page))
oCmdDisp.Parameters.Append oCmdDisp.CreateParameter(
"page_size", adInteger, adParamInput, 10Clng(page_size))
set oRsDisp = oCmdDisp.Execute()
注意看最顶上的那行被注释的转义语句,如果不注释这行语句,ASP页面就会报错,注释后就可以正确执行,所以大熊估计可能是(Command)对象内部就有对单撇号进行转义的能力,因此提前对字符串进行转义倒成了多余之举,汗!
  不过问题也算是得以圆满解决,程序跑得比以前快了很多,功夫总算没白费,不过提醒大家以后要注意下下这些小细节,有的时候,真的真的会弄死人的!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值