最近在网上看到不少网友因为在写 sql语句时因为引号引起的问题,我在刚开始用vb的
时候也经常犯这样或那样的错误,这次将使用的经验写出来与大家共享。
* 举例时以 vb6.0为依据;
* vb与vbscript不同的地方将分别说明;
* 数据库连结用 ado。
要点:
在 vb&vbscript中,标记字符串变量内容用双引号,用两个连续的双引号表示字符串中
的双引号;
在 sql语法中,标记字符串变量内容用单引号,用两个连续的单引号表示字符串中的单
引号。
在 vb&vbscript中访问数据库的时候最常用的是以下两种语句:
1、选择查询(select),返回结果集;
2、动作查询(update、insert、delete等),无结果集。
无论哪一种语句,经常需要根据用户的输入来构造符合 sql语法的字符串,提交给连结
对象或结果集对象来执行(open或 execute方法),在 vb&vbscript中,标记字符串变量内
容用双引号,如
strsql="select * from userlist"
在 sql语法中,标记字符串变量内容用单引号,如:
select * from userlist where username='mousefly'
如果程序的窗口(浏览器的页面)上有两个文本框用于让用户输入登记注册的用户信息
或者是查询条件,假设用户输入了“mousefly”、“1234”,需要登记到数据库的一个用户
注册表 userlist中,则sql字符串应如下组织:
strsql="insert into userlist (username,password) values (" & _
"'" & me.txtusername.text & "'," & _
"'" & me.txtpassword.text & "')"
生成的结果为:
insert into userlist (username,password) values ('mousefly','1234')
但是如果用户输入中包含了单引号,如“12'3”,按照上面的组织方法则为:
insert into userlist (username,password) values ('mousefly','12'3')
这时再执行的时候,会提示 sql语法错误,原因就在于“12'3”中的单引号,由于在 sql语
法中,标记字符串变量内容用单引号,因此“'12'3'”无法被正确识别,所以在组织字符串
的时候要考虑将用户输入的单引号替换成两个连续的单引号,此时要用到replace函数:
strsql="insert into userlist (username,password) values (" & _
"'" & replace(me.txtusername.text,"'","''") & "'," & _
"'" & replace(me.txtpassword.text,"'","''") & "')"
结果为:
insert into userlist (username,password) values ('mousefly','12''3')
如果使用的是vbscript则me.txtusername.text和me.txtpassword.text要换成相应的浏览器
提交的内容,如request.form("username")和request.form("password")。
如果赋值的字段类型是数字型的,则要去掉字符串两端的单引号,假设password字段是
数值型,并且用户输入的是“1234”,则(此处略去数字输入校验):
strsql="insert into userlist (username,password) values (" & _
"'" & me.txtusername.text & "'," & _
me.txtpassword.text & ")"
生成的结果为:
insert into userlist (username,password) values ('mousefly',1234)
如果字段类型是日期型,在 ado中和处理字符串差不多,只不过要注意日期型字段的格
式,最好在组织 sql字符串的时候对日期进行格式化保证年份是4位,如:
strsql="insert into userlist (username,password,birthday) values (" & _
"'" & me.txtusername.text & "'," & _
me.txtpassword.text & "," & _
"'" & format(me.txtbirth.text,"yyyy-mm-dd") & "')"
生成的结果为:
insert into userlist (username,password,birthday) values
('mousefly',1234,'1975-01-15')
如果使用的是vbscript,对日期进行格式化使用formatdatetime函数。