欢迎光临
我们一直在努力

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

建站超值云服务器,限时71元/月

—- 和数据库打交道要频繁地用到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),它的内容预先设定为"paolof"、"paolof"。command1演示方法一,

command2演示方法二,msflexgrid1存储方法二查询(select)结果。对于其他的sql操作(insert、delter、updatae)方法

极为类似,笔者就不再赘述。例子中用到sql server中的pubs数据库中的employee表,同时可以用sql语法把其中两条记录

中的fname改为"paolof"、"paolof"。 sql语法如下:

update employee set fname=" paolof"

where emp_id=pma42628m

update employee set fname=" paolof"

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.fields.count – 1

msflexgrid1.col = j + 1

msflexgrid1.text = rstbyquery(j) 添充所有的列

next

rstbyquery.movenext

loop 这个循环用来填充msflexgrid的内容

end sub

private sub command2_click()参数方法

dim i as integer

dim j as integer

set parm = new adodb.parameter

set mycommand = new adodb.command

parm_jobid.name = "name1" this line can be ommited

parm.type = adchar 参数类型

parm.size = 10 参数长度

parm.direction = adparaminput 参数方向,输入或输出

parm.value = combo1.text 参数的值

mycommand.parameters.append parm 加入参数

mycommand.activeconnection = cnn1

指定该command 的当前活动连接

mycommand.commandtext = " select *

from employee where fname =? "

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

rstbyquery.requery

do while not rstbyquery.eof

i = i + 1

msflexgrid1.row = i 确定行

for j = 0 to rstbyquery.fields.count – 1

msflexgrid1.col = j + 1

msflexgrid1.text = rstbyquery(j) 添充所有的列

next

rstbyquery.movenext

loop 这个循环用来填充msflexgrid的内容

end sub

—- 查询部分可以用存储过程以提高处理效率,减低网络流量。

—- 本程序在nt workstation 4.0 sp4、sql server 7.0 上调试通过。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Ms SQL Server 中单引号的两种处理技巧
分享到: 更多 (0)