关于ADOQuery的一个问题,急!(50分)

  • 主题发起人 主题发起人 fookk
  • 开始时间 开始时间
F

fookk

Unregistered / Unconfirmed
GUEST, unregistred user!
控件: 我用两个Datetimepicker,一个DBGrid,一个ADOQuery,一个DataSource和一个button控件.数据库是Access2000的,其中有一个日期型字段time.
目的: 用两个Datetimepicker输入起始日期和终止日期,按button按钮将查到的记录显示在DBGrid控件中.
方法: adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from sfxx where (time>='+'"'+datetostr(datetimepicker2.Date)+'"'+') and (time<='+'"'+datetostr(datetimepicker3.Date)+'"'+')');
adoquery1.open;
遇到问题: 按下button按钮,可以查询到有关记录.但调整Datetimepicker的日期,DBGrid中为空,再调回也为空.
代码:
 
应把Datetimepicker的值用作查询参数来使用
 
Delphi的时间类型和Access的时间类型有一定的差异,
Delphi的时间类型是以天为单位的,而Access是以毫秒为单位的,
他们的起始时间也不一样,存在这样一个关系(我费了九牛二虎之力才算出来)
DelphiDate=AccessDate/24/3600/1000-1900*365-94
 
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from sfxx where (time>="#'+datetostr(datetimepicker2.Date)+'#") and (time<="#'+datetostr(datetimepicker3.Date)+'#")');
adoquery1.open;
 
Access的JET SQL中日期时间应该用#...#封装而不用双引号
用参数可回避日期时间格式和封装问题,否则还应该用适当的格式
 
the best way is to use parameter ,Such as;
adoquery1.SQL.Add('select * from sfxx where (time>=:time1)');
adoquery1.SQL.Parameter.ParamByName('time1').Value;=datetimepicker2.Date;
adoquery1.SQL.Open;
 
To drawpharos:
不论用天还是毫秒计算时间写成字符串都是一样的XXXX-XX-XX,忽略时分秒,
所以Delphi和Access对字符串时间格式的理解是一样的。
To lld:
我怎么发现你Access封装字符时间是用"#和#",到底有没有那个双引号,能否解释一下?
To gengjianxin:
ParamByName('X').value和.AsString有什么区别,好像后者更明确?
To fookk:
我也赞成用参数化SQL语句。
 
设定时间格式为:yyyy-mm-dd
adoquery1.SQL.Add('select * from sfxx where (time>='+datetostr(datetimepicker2.Date)+') and (time<='+datetostr(datetimepicker3.Date)+')');
 
time字段不是关键字段(可能同一日期有若干记录),有一个no字段为自累加型.以上方法都无用.
newid:差不到记录(存在).
注意:要求查询
(起始日期------至------终止日期)的所有记录
 
datetostr(xxx)改成 FormatDateTime('yyyy-mm-dd',xxx)这样比较清楚他转换成了什么字符串
DateToStr是使用短日期格式,不同机器可能转换结果不同
 
多人接受答案了。
 
后退
顶部