ADOQuery.SQL:='select * from table1 where (recno=:recno) and
(dtt<=:endDateTime) and (dtt >=:startDateTime); 里不少个单引号么?
(dtt<=:endDateTime) and (dtt >=:startDateTime); 里不少个单引号么?
解决方案 »
- 连接到共享的ACCESS数据库问题
- delphi 2007怎么安装源码,现在安装的时候没有附带如Classes.pas单元,想查看函数原型或某些结构时很麻烦
- 纯粹放分,祝贺自己刚生存255555个小时
- 请教高手
- 求教idUDPSever和idUDPCLient穿透防火墙的代码
- 一个线程应用问题
- 200分求一个计算器的源程序..级别不够.分可以另外开帖再加!!!!
- 如何使窗体上系统关闭不可用,而最小,最大化可用?
- 有没有用DSPack开发的录制屏幕的例子 ???
- 如何在TClientDataSet(或TDataset)中删除一个字段?
- 大家讲讲对D6的Web Snap的看法,诚心交流者都又分。
- 我想用delphi6+mssql2000开发一套英语考试软件,大家有什么好的建议吗,谢谢
ADOQuery.SQL:='select * from table1 where (recno=:recno) and
(dtt<='':endDateTime'') and (dtt >='':startDateTime)''';
客户端:
把dtEnd,dtStart设为String类型变量;
ClientDataset.Params.ParamByName('endDateTime').AsString :=dtEnd;
ClientDataset.Params.ParamByName'startDateTime').AsString:=dtStart;
ADOQuery.SQL:='select * from table1 where (recno=:recno) and
((dtt<=:endDateTime) and (dtt >=:startDateTime))';
(dtt<='':endDateTime'') and (dtt >='':startDateTime'')';
使用sql的参数时要指定参数的类型。
ClientDataset.Parameters.ParamByName(recno).DataType := ftString;
ClientDataset.Parameters.ParamByName(recno).Value:=strRecno;
ClientDataset.Parameters.ParamByName('endDateTime').DataType := ftDateTime;
ClientDataset.Parameters.ParamByName('endDateTime').Value :=dtEnd;
ClientDataset.Parameters.ParamByName('StratDateTime').DataType := ftDateTime;
ClientDataset.Parameters.ParamByName('StartDateTime').Value :=dtStart;
ClientDataset.Open ;
看起来服务器端好像没有问题。
首先确认所有参数在clientdataset里都被正确定义了。
---------
因为在SQL 语句中,日期型是当作字符来处理的。
另外,给你一个建议,就是把有问题的SQL语句,输出,然后拿到SQL ANALYZER上
去进行语法分析,这样就知道错在哪了。
ClientDataset也没有问题,因为之前我对filter设置,是没有问题的,
不过考虑效率,才改用SQL,但是改了之后就不行了。
诸如语句ClientDataset.Parameters.ParamByName(recno).DataType := ftString;,我在设计状态下对ADOQuery和ClientDataset已经设置过了,而且还有Tparam.size属性。
但就是不知道问题出在哪里
我做了改动:
server: ADODataset,没有动态参数,commandtext:='select * from table1';
Client: ClientDataset,加入三个动态参数,recno,StartDateTime,endDateTime;并在设计期对其进行设置
程序如下:
:
ClientDataset.Close;
ClientDataset.commandtext:='select * from table1 where (recno=:recno) and
(dtt<=:endDateTime) and (dtt >=:startDateTime)';
ClientDataset.Params.ParamByName(recno).AsString:=strRecno;
ClientDataset.Params.ParamByName('endDateTime').AsDateTime :=dtEnd;
ClientDataset.Params.ParamByName('startDateTime').AsDateTime
:=dtStart;
ClientDataset.Open ;
ClientDataset.Params.ParamByName('endDateTime').AsDateTime
ClientDataset.Params.ParamByName('startDateTime').AsDateTime
都有值,而且正确,
不过在执行Open语句时就出错!如果能解决问题,再奉送100分也没关系!!!!!问题我是最初我在ADOQuery.SQL中写带动态参数的查询语句,不是把参数写在了服务器端吗?两种情况我都试过了,都不行。
看来,方法肯定可行,但是不知道是不是开发环境的问题,我用的是D6,不知是否
有问题。或者别的地方出错了
请改为ClientDataset.Params.ParamByName('recno').AsString:=strRecno;
最好用ClientDataset.Params[0].AsString:=strRecno;
是可以的,可以执行,但是如果时间日期格式为2001-1-1 10:00:00的时候,
则提示:变量或者类型不正确,或者不在可以接受的范围内,要不就与其他数据冲突。时间日期如果是'2000-1-1'等带符号的则不能执行。
不过上面查询只是在简单查询,比如dtt>=2000-1-1时可以执行,如果双重条件,比如dtt>2000-1-1 and dtt<2002-3-22,则虽然不提示出错,但是却不能查出数据,虽然存在有合乎条件的数据。
我的查询必须带时间条件,我该怎么办?
ADOQuery.SQL:='select * from table1 where (recno = '''+IntToStr(recno)+''') and (dtt <= '''+DateToStr(endDateTime)+''') and (dtt >='''+DateToStr(startDateTime)+''''
自已构成SQL语句 DateToStr DateTimeToStr与设置的日期格式有关
这个恐怕要在ClientDataset才能用吧,要不参数怎样传过去?
我对你的帖子关注很多天,对于你的问题,我也没有很好的办法,不过你提醒了我一个很重要的、却一直在忽视的问题,那就是:在sql server中,对于日期时间型的字段,很难做出一个精确的比较!!!我觉得与其和它较劲,还不如将日期时间型的字段转成字符型(除了要精确到时间的字段),可能在客户段编程稍微麻烦了一点,但可以提高效率,由于转换的结果有你控制,还可以避免由于计算机设置造成的时间格式的不同,因为你很难保证你的每一个客户机及服务器均采用同样的设置我建议你这么处理。
1、可以直接不用指定类型,用.value直接把字符串传递回去。
2、客户端直接构造Sql语句的字符串,不用参数。你试验不能执行是用Query Analyzer里试验的吗,那就更不该有错了。
不过竟然还是提示出错。我实在没办法,就又用clientDataset.CommandText属性进行查询,
时间日期长格式老出错,我就用了短格式yyyy-mm-dd,
commandtext:='select * from table1 where dtt='+DateTimeToStr(dtDate);程序中第一次用到的地方没有问题,不过第二次调用的地方就
提示出错:变量或者类型不正确,或者不在可以接受的范围内,要不就与其他数据冲突。
注意,这个结果会跟系统区域设置里的设置相关。
自己构造字符串吧,免得不一致。'select * from table1 where dtt='+DateTimeToStr(dtDate)
不要引号可以吗,一般还是加上引号:
'select * from table1 where dtt='+#39+DateTimeToStr(dtDate)+#39
DateToStr(Round(today()))
先sql,后过滤,得到想要的结果。
其实对时间,至少对于access来说,要队时间加上#mydate#,才比较好用。再次向大家的支持表示感谢。多谢大家!