Delphi查询Access日期/时间字段报错的自我总结

来源:互联网 发布:windows系统正版验证 编辑:程序博客网 时间:2024/06/05 17:01

现象描述  

最近学习Delphi,在学习连接Access数据库的时候发现有个问题:通过使用的是

ADOConnection+DataSource+ADOQuery 方式连接数据库
连接。执行查询语句中如果没有时间类型就没有问题,如果包含时间在里面就有问题.代码如下:
SqlStatement := Format('SELECT distinct Time FROM [Memo] WHERE datediff(''d'',Time,#%s#)=0 And Time >#10/29/2013 9:30#',[SysData]);//Delphi查询Access日期字段是这样的。  SqlAdd := Format(' And Time >#%s#',[SysTime]);  try    MADOQuery.Close;    MADOQuery.SQL.Clear;    MADOQuery.SQL.Add(SqlStatement);    MADOQuery.SQL.Add(SqlAdd);    MADOQuery.Open;    if MADOQuery.RecordCount >0 then      begin.....{执行一些操作}end;

也就是:执行

Select Distinct Time From [Memo] Where Time > #2013/10/29 9:30:0#这条语句是有问题的,但是执行Select  Distinct Time From [Memo] Where Time > #2013/10/29#就没有问题,抱着学习的态度然后就是来排除故障,首先我怀疑是SQL语句有问题,于是将这条语句放入Access中执行了一边,没有问题可以实现,后来有怀疑自己在Access中的字段设置出了问题,于是乎就跑过去弄Access中Time这个字段,将它设置为常规时间,长时间等等,试了好久最终发现没有Access什么事,它是无辜的,然后就是找资料,后来看到书上说":"是Delphi系统中的关键符号,我就猜测是不是因为“:”,于是上网上搜这方面的资料,刚好发现原来还真有这个东西:Delphi中“:”表示参数的意思,就是说系统把9:30当成30是9的参数于是去检查9中的参数30去了,我们编过程的都知道,这肯定查不到了,于是就你知道的,系统报错,“

下面找到了原因来说解决方案:

系统自检功能才导致出差,因此我只需要禁止掉自检,执行SQL语句的是TADOQuery,我们只需要将MADOQuery.ParamCheck:=False就行了,

SqlStatement := Format('SELECT distinct Time FROM [Memo] WHERE datediff(''d'',Time,#%s#)=0 And Time >#10/29/2013 9:30#',[SysData]);  SqlAdd := Format(' And Time >#%s#',[SysTime]);  try    MADOQuery.Close;    MADOQuery.SQL.Clear;
    MADOQuery.ParamCheck := False;//修改这里
MADOQuery.SQL.Add(SqlStatement); MADOQuery.SQL.Add(SqlAdd); MADOQuery.Open; if MADOQuery.RecordCount >0 then begin
如果你怕自己对Delphi不熟悉,禁掉这个属性会有问题,你就可以在你执行完你的SQL语句之后这是设置回来该属性。

原创粉丝点击