一个关于ADOQuery 的SQL参数问题。急!!! ( 积分: 100 )

  • 主题发起人 主题发起人 streamone
  • 开始时间 开始时间
S

streamone

Unregistered / Unconfirmed
GUEST, unregistred user!
环境 delphi7 + SQL server 2000

表:CUNFEN
XM(varchar) JSF(bigint)
李连杰 5
李 -5
张 三 10

有如下语句:
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT XM,JSF+:FZ AS JSF');
SQL.Add('FROM CUNFEN');
SQL.Add('WHERE XM=:XM');
Parameters.ParamByName('FZ').Value:=25;
Parameters.ParamByName('XM').Value:='李连杰';
open;
end;

返回结果:
XM JSF
李 20

如改写成

with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT XM,JSF+25 AS JSF');
SQL.Add('FROM CUNFEN');
SQL.Add('WHERE XM=:XM');
Parameters.ParamByName('XM').Value:='李连杰';
open;
end;


with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT XM,JSF+:FZ AS JSF');
SQL.Add('FROM CUNFEN');
SQL.Add('WHERE XM=''李连杰''');
Parameters.ParamByName('FZ').Value:=25;
open;
end;

则返回结果均为:
XM JSF
李连杰 30


用 SQL server 2000 的“事件探查器”跟踪发现第一种写法只传给 SQL server 2000
参数“XM”的第一个字,即“李连杰”的“李”字,所以结果出错。

可是为什么会这样呢?难道是Delphi7的BUG?可是我刚刚打了1.1的升级补丁啊。哪位高手知道原因和解决方法?
十万火急!!!!
 
环境 delphi7 + SQL server 2000

表:CUNFEN
XM(varchar) JSF(bigint)
李连杰 5
李 -5
张 三 10

有如下语句:
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT XM,JSF+:FZ AS JSF');
SQL.Add('FROM CUNFEN');
SQL.Add('WHERE XM=:XM');
Parameters.ParamByName('FZ').Value:=25;
Parameters.ParamByName('XM').Value:='李连杰';
open;
end;

返回结果:
XM JSF
李 20

如改写成

with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT XM,JSF+25 AS JSF');
SQL.Add('FROM CUNFEN');
SQL.Add('WHERE XM=:XM');
Parameters.ParamByName('XM').Value:='李连杰';
open;
end;


with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT XM,JSF+:FZ AS JSF');
SQL.Add('FROM CUNFEN');
SQL.Add('WHERE XM=''李连杰''');
Parameters.ParamByName('FZ').Value:=25;
open;
end;

则返回结果均为:
XM JSF
李连杰 30


用 SQL server 2000 的“事件探查器”跟踪发现第一种写法只传给 SQL server 2000
参数“XM”的第一个字,即“李连杰”的“李”字,所以结果出错。

可是为什么会这样呢?难道是Delphi7的BUG?可是我刚刚打了1.1的升级补丁啊。哪位高手知道原因和解决方法?
十万火急!!!!
 
参数只能在Where部分,Select部分不能使用参数。
如果实在需要,只能动态构建Sql语句
 
确实有这样的BUG,你还是换后面的方法吧.
 
我也遇到过,顶
 
你的Mdac是多少。
 
问题解决了,改写为:
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select xm, jsf+:fz as jsf');
sql.Add(' from cunfen');
sql.Add(' where xm=:xm');
parameters.ParamByName('fz').Value := 25;
parameters.ParamByName('xm').Size := 6;
parameters.ParamByName('xm').Value := '李连杰';
open;
end;
运行通过,OK了。
还有一个小问题,谁知道ADOQuery.Parameters.ParamByName('XM').DataType有什么用?Parameters.ParamByName('XM').Value是Variant类型,是不是加上一句Parameters.ParamByName('XM').DataType:=ftString;可以将其指定为固定类型而提高程序运行效率?
 
由于问题解决了,我会很快结帖的,欢迎更多高手指点。
 
数据类型
 
用datatype 可以少走一道转换 可以提高点效率 但影响不大
 
尽量不要用传参的方式,效率较低
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT XM,JSF+' + IntToStr(25) + ' AS JSF');
SQL.Add('FROM CUNFEN');
SQL.Add('WHERE XM = ''' + xm + ''' '); // xm = '李连杰'
open;
end;
 
同意xianguo,
 
同意xianguo的意见,我也一直用的动态生成SQL的方法,效率较高。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
493
import
I
后退
顶部