ADOQuery的动态参数问题(200分)

  • 主题发起人 主题发起人 geminii
  • 开始时间 开始时间
G

geminii

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中写入:
with adoquery do
begin
close;
sql.clear;
sql.add('select * from ATable where adate = :lsrptdate');
Parameters.ParamByName('lsrptdate').Value := '2001.03';
open;
end;
当运行到语句:sql.add('select * from ATable where adate = :lsrptdate');时
出现:“变量或者类型不正确,或者不在可接受范围之内,要不就是与其他数据冲突。”的错误

我知道在adoquery控件(Object Inspector)的sql中直接写如语句:select * from Atable where adate = :lsrptdate
再在程序中调用
with adoquery1 do
begin
close;
Parameters.ParamByName('lsrptdate').Value := '2001.03';
open;
end;
是没错的。
但是在程序中调用就是错,不知道是什么原因,望大虾指点。
 
怎么就没人回答啊?很急呀!!!答对了,我再加分。
 
没有指定参数的类型,解决方法有两种
1.不要用value,而用asdate或asstring之类的一指明参数类型二指定参数值
2.在指定value前用datatye指定参数类型如datatype:=ftString,datatype:=ftdate之类的
注:参数的类型决定于你的adate字段类型
 
with adoquery do
begin
with sql do
begin
close;
clear;
text:='select * from 表名 where 字段名='''+strtofloat('2001.03')+'''';
end;
open;
end;
 
To sonie:
我也已经初始化了变量的类型,如下语句:
with ADOquery1 do
begin
parameters.CreateParameter('lsrptdate',ftstring,pdinput,10,'');
Close;
sql.add('select * from ATable where Adate = :lsrptdate');
Parameters.ParamByName('lsrptdate').Value := '2001.03';
Open;
end;
但还是出现一样的错误,字段Adate的类型是char(10)
您能不能将调试通过的程序给我呢?先谢谢了。

To puremoonstone:
因为我现在需要的就是替换Tquery原先可用的动态参数的功能,所以虽然知道您的方式是
肯定可行的,但还是不能用,在这里先谢谢了。
 
定义为变量.
var
TempFloat:double;
TempStr:string;
TempStr:=floattostr(TempFloat);
with adoquery do
begin
with sql do
begin
close;
clear;
text:='select * from 表名 where 字段名='''+strtofloat(TempStr)+'''';
end;
open;
end;
 
不,你别这样,你把parameters.createparameter那句删了就这样试试:
with adoquery1 do
begin
close;
clear;//记得用add则先clear
sql.add('select * from ATable where Adate = :lsrptdate');
Parameters.ParamByName('lsrptdate').asstring:= '2001.03';
open;
end;
试试
 
当然记得ParamCheck要设为true
 
to sonie:
对不起上面的我忘了写上sql.clear了
但就是写了sql.clear也还是一样的错的。
 
To sonie:
paramcheck肯定是true了。呵呵,这个我是知道的
 
定义为变量的方法是可以的。
 
这句话有问题 Parameters.ParamByName('lsrptdate').Value := '2001.03';
不应该是.value;
应换成与右边相应的类型
 
TO puremoonstone:
我知道你的方法肯定是可以的,但是我现在想用的是定义动态参数的方法。
To kisse:
不是这个原因。
 
以下代码我调试了,你试试
....
with adoquery1 do
begin
close;
clear;
sql.text:='select * from ....';
Parameters.items[0].datatype:=ftstring;
Parameters.items[0].value:='2001.03';
open;
end;
 
也就是说我第一次说的第二种方法是可以的
parameters.parambyname('..').datatype:=...;
parameters.parambyname('..').value:=...;
注意没有createparameter!
 
To sonie:
您在语句
with adoquery1 do
begin
close;
clear;
sql.text:='select * from ....';
Parameters.items[0].datatype:=ftstring;
Parameters.items[0].value:='2001.03';
open;
中:
sql.text:='select * from ....'如果设了变量:lsrptdate的话,会不回出现问题?
即:sql.text:='select * from Atable where adate=:lsrptdate'会不会有问题?
我就是在这句出现问题的。
AdoQuery1.parameters.CreateParameter();这个函数是有的。
 
faint
1.你怎么不试试了,我调试通过了,用动态参数就是你原来的语句,我是因为懒才没有写全
2.我不是说没有createparameter这个函数,而是说这里不要这个
好了,我写全,你试试:

with adoquery do
begin
close;
sql.clear;
sql.add('select * from ATable where adate = :lsrptdate');
Parameters.ParamByName('lsrptdate').datatype:=ftString;//也可换成parameters.items[0].datatype:=ftstring;
Parameters.ParamByName('lsrptdate').Value := '2001.03'; //同上
open;
end;
 
To sonie:
我真的是完全照你的语句试过了,真的不行啊。
我想问一下,你的MDAC版本是多少?
 
不好意思怎么样查看mdac的版本
我用的delphi5,全部用的是d5的标准控件.
用的provider是microsoft ole db provider for sql server
 
我也一样是用delphi5的标准控件和sql server的。
而且我的几个朋友也出现跟我相同的问题。
所以我们觉得很奇怪,算了,就现在这样了。明天问borland公司去,呵呵。谢谢你了。
分都大部分都给你了。


如果还有什么其他的方法,还请告诉我,我会再加分的,谢谢了。
 

Similar threads

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