如何在ADO中的TADOQUERY中实时用参数 (50分)

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

goodman

Unregistered / Unconfirmed
GUEST, unregistred user!
在其中写一SQL语句需要用不同的时间参数(即据需要取TDATETIME中的数据做参数),在
BDE中能成的语句,在ADO中一用就错。
 
1。注意时间的格式
2。最好用数据库中内置的时间函数
 
此语句在BDE中用时是正常的
query1.Close;
query1.sql.Clear;
query1.sql.add('select itemtype.descriptionb,itemcode.descriptionb,original,left(sum(quantity),4),left(original*sum(quantity),10) from posiage join itemcode on itemcode.itemcode=posiage.itemcode join itemtype on itemtype.itemtype=itemcode.itemtype where'+'');
query1.sql.add('posttime between (:f) and (:e) and posiage.creordeb=0 and itemtype.descriptionb=:s group by itemcode.descriptionb,original,itemtype.descriptionb order by itemtype.descriptionb');
query1.ParamByName('f').asstring:=datetostr(dt1.date);
query1.ParamByName('e').asstring:=datetostr(dt2.date);
query1.ParamByName('s').asstring:=(cbx.text);
query1.prepare;
query1.open;
结果一切正常。

在ADO 中我用
ADODATASET1.Close;
adodataset1.CommandText:='';
adodataset1.commandtext:='select itemtype.descriptionb,itemcode.descriptionb,original,left(sum(quantity),4),left(original*sum(quantity),10) from posiage join itemcode on itemcode.itemcode=posiage.itemcode join itemtype on itemtype.itemtype=itemcode.itemtype'+'where'+''
+ 'posttime between (:f) and (:e) and posiage.creordeb=0 group by itemcode.descriptionb,original,itemtype.descriptionb order by itemtype.descriptionb';
adodataset1.commandtype:=cmdtext;
adodataset1.Parameters.parambyname('f').value:=datetostr(dt1.date);
adodataset1.Parameters.parambyname('e').value:=datetostr(dt2.date);
adodataset1.Prepared;
adodataset1.open;
编译不出错可用时就报错,用ADODQUERY也如此,
 
if QueryForm.CheckBox_Date.Checked then
if QueryStr = '' then
QueryStr := ' where substring(convert(char,extend_date,21),1,10)=''' + FormatDateTime('yyyy-mm-dd', QueryForm.DateTimePickerExtendDate.DateTime) + ''''
else
QueryStr := QueryStr + ' and substring(convert(char,extend_date,21),1,10)=''' + FormatDateTime('yyyy-mm-dd', QueryForm.DateTimePickerExtendDate.DateTime) + '''';
ADOQuery.Active := False;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('select * from info ' + QueryStr);
ADOQuery.Active := True;

不会吧,我用datetime用得好好的啊
 
BDE可以只能的识别参数的类型和长度,ADO需要你在设计时或代码中指定Parameters的
类型和长度
 
我也遇到了同样的问题,解决廖请给我点。My E-Mail:TJX76@yeah.net
 
ADO需要你在设计时或代码中指定Parameters的
类型和长度
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
正确
 
有个苯方法,先把时间值转为字符串,再将该字符串转为时间值来赋值
在ACCESS中我常这样做
 
我也碰到了这样的问题,好象是出这个错误:
Optional feature is implemented
设置了参数类型也不行

>>萧月禾:有个苯方法,先把时间值转为字符串,再将该字符串转为时间值来赋值
我也这样用过,但是还是不能解决问题,我觉得这是ADO 的BUG,但是装ADO的补丁
还装不上,老是出错,我用的是NT,后来听说NT下不能装这个补丁,也不知道是
不是真的。



 
同意楼上的兄弟!
 
现在问题解决了
这样用就没问题了
with AdoQuery1 do
begin
Close;
SQL.Clear;
SQL.Text := 'insert into testtable(field1,field2,startdate) values(:Param1,:Param2,'+DateToStr(DateTimePicker1.Date)+')';
Parameters[0].Value := 字段值;
Parameters[1].Value := 字段值;
ExecSQL;
end;
也就是说不用参数付值,而是直接给值就可以了,已经做过测试,没有问题
 
谁能告诉我怎样在ADO USE “ADOQUERY”IN“COMMANDTEXT”(SQL语言编写);
 
MainFm.NetADOQry.Parameters.CreateParameter(
'IDP',ftString,pdInput,8,'');

undeclared identifier: 'ftString'!!!!!// D6 的BUG!!!????

D6中的例子
ADOStoredProc1.CreateParameter('Parm1', ftString, pdInput, 10, nil);//

我试了,用 ftString 和 nil 都不行,帮助是这样写的:
function CreateParameter(const Name: WideString; DataType: TDataType; Direction: TParameterDirection; Size: Integer; Value: OleVariant): TParameter;
用 nil 报错,说 OleVariant 和 TPointer 不匹配!!

明显自相矛盾!!!!!

神啊,救救我吧!!!!!!
 
谢谢,大家好久没来了,不过问题早已搞定了
 
后退
顶部