如何捕获SQL语法错误?
有如下代码:
------------------------------------------------------------------------
On Err GoTo MyErr
……
'增加体检数据到santong表
strSQL = "insert into santong(姓名,生日,编号,性别,年龄,体重,体重评价,身高,身高评价,头围,头围评价," _
& "前卤,牙齿,左视力,右视力,听力,发育商,营养评价,Hb,检查日期,下次日期,备注," _
& "Eduction,Food,IllProtect) " _
& "values('" & Text1.Text & "','" & DTPicker2.Value & "','" & Text2.Text & "'," _
& "'" & Combo1.Text & "','" & Text3.Text & "','" & Text4.Text & "','" & WeightCode(WeightIndex) & "'," _
& "'" & Text5.Text & "','" & HeightCode(HeightIndex) & "','" & Text6.Text & "','" & HeadCode(HeadIndex) & "'," _
& "'" & Text7.Text & "','" & Text8.Text & "','" & Text9.Text & "','" & Text10.Text & "'," _
& "'" & Text11.Text & "','" & Text12.Text & "','" & strYY1 & " " & strYY2 & " " & strYY3 & "','" & Text13.Text & "'," _
& "'" & DTPicker1.Value & "','" & NextDate & "','" & Text19.Text & "','" & stEduction & "'," _
& "'" & stFood & "','" & stIllProtect & "')"
cnn1.Execute (strSQL)
……
Exit Sub
MyErr:
MsgBox Err.Description
Err.Clear
--------------------------------------------------------------------
发现,如果在text中输入非法字符,如单引号'时,Err并不能捕获错误,导致程序退出。
如何避免这个问题呢?
问题点数:50、回复次数:14Top
1 楼zgtt(闻涛)回复于 2002-01-23 02:51:43 得分 1
增加一个判断啊,
是'就不要存啊Top
2 楼wqb(啊喂)回复于 2002-01-23 08:40:25 得分 1
on error goto MyErrTop
3 楼Random(随便)回复于 2002-01-23 08:53:59 得分 1
用 private withevents cnn1 as adodb.connection
然后在cnn1_infomessage事件中编程试试Top
4 楼lily0000000(heaven)回复于 2002-01-23 09:15:00 得分 1
先把代码拷贝到SQL Server的Query Analyzer中试一下,正确了再在工程中执行,不正确的话,Query Analyzer会提示错误,并可以修改后继续执行。很有用的哦。Top
5 楼songyangk(小草)回复于 2002-01-23 09:22:34 得分 1
将所有输入的单引号都转换成两个单引号就行了。Top
6 楼platinumkill(platinumkill)回复于 2002-01-23 09:28:54 得分 1
在此设一个断点cnn1.Execute (strSQL),在DEBUG窗口中用?STRSQL将STRSQL语句取出来,然后放到使用数据库的SQL语句调试窗口上调试通过了再使用此SQL语句。或者不要让用户输入这些非法字符,在change事件里写代码屏蔽非法字符的输入。Top
7 楼chsl918(Story Book)回复于 2002-01-23 09:45:12 得分 1
我认为你程序最好不要都放到一句中这样不好处理
我的做法是定义两个字符串
dim str1$,str2$
再进行分别赋值:
sStr1 = "": sStr2 = ""
sStr1 = sStr1 & "PolishID,": sStr2 = sStr2 & txtId & ","
sStr1 = sStr1 & "PName,": sStr2 = sStr2 & "'" & txtName & "',"
sStr1 = sStr1 & "PNumber,": sStr2 = sStr2 & txtNumber & ","
... ...
最后再
加上一句
sStr1 = "Insert into Polish (" & sStr1 & ") Values(" & sStr2 & ")"
这样就可以进行分别判断了!!比如下面这点:
If txtDemo <> "" Then
sStr1 = sStr1 & "Demo,": sStr2 = sStr2 & "'" & txtDemo & "',"
End If
当然你的问题就可以各个处理了!我想应当是:
for i=1 to len(txtDemo)
if mid(txtDemo,i,1)="'" then
你的处理程序
exit for
end if
next i
以上for循环程序没有经过测试,应用时请注意!!其他都是我编的程序放心用吧!!Top
8 楼dbcontrols(泰山__抛砖引玉)回复于 2002-01-23 10:15:53 得分 1
给医院做的,银子不少吧?用记录集吧,到http://www.wzjcw.net/vbgood/taishan/index.html
下载个代码看看。Top
9 楼sc_lys(太岁)回复于 2002-01-23 10:18:29 得分 1
解决办法:
1。输入屏蔽。如:不输入"'",可用如下语句:
在KeyPress事件中:
if keyascii=asc("'") then keyascii=0 : exit sub
(控制其他字符雷同)
2。更好的解决办法,是用 VBA.Replace函数将一个单引号替换为两个单引号。
其具体用法请参阅帮助(很简单的)。Top
10 楼carefulman(我要进步!)回复于 2002-01-23 10:50:40 得分 1
为什么不用存储过程呢!通过返回值判断是否成功就行了!
如果是屏蔽非法字符可以在生成字符串时自己写个函数来替换。
强烈推荐replace(yourstr ,"'","''")Top
11 楼jshyjyw(狐说九道)回复于 2002-01-23 14:34:25 得分 0
其它的数据有效性判断,如text1.text=""之类的,我都处理好了。我省略了没帖出来。
关键是,我不知道哪些字符可能造成SQL语句出错。
用on err goto捕获不了这样的错误。
Top
12 楼wqb(啊喂)回复于 2002-01-23 14:41:44 得分 39
on err goto ?
on error goto!Top
13 楼tonton(tonton)回复于 2002-01-23 14:52:31 得分 1
很简单的问题。
就是不要让有错误的变量进入SQL语句。
在生成SQL语句之前就截住它。提示或更改,
然后再生成SQL语句,最后执行它。Top
14 楼jshyjyw(狐说九道)回复于 2002-01-23 15:09:20 得分 0
我气的吐血啊!
谢谢你啊,: wqb(啊喂) !
on err goto ?
on error goto!
打错了,VB竟然没有报错!
晚上或明天晚上给分。
Top




