ADOQuery.SQL:='select * from table1 where (recno=:recno) and 
(dtt<=:endDateTime) and (dtt >=:startDateTime);  里不少个单引号么?

解决方案 »

  1.   

    服务器端:
    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;
      

  2.   

    服务器端:
    ADOQuery.SQL:='select * from table1 where (recno=:recno) and 
    ((dtt<=:endDateTime) and (dtt >=:startDateTime))';
      

  3.   

    ADOQuery.SQL:='select * from table1 where (recno='':recno'') and 
    (dtt<='':endDateTime'') and (dtt >='':startDateTime'')';  
      

  4.   

    同意 forgot(让一切随风)
      使用sql的参数时要指定参数的类型。
      

  5.   

    ClientDataset.Close;
    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 ;
      

  6.   

    是不需要括号的,能知道是那个参数没有传递吗。
    看起来服务器端好像没有问题。
    首先确认所有参数在clientdataset里都被正确定义了。
      

  7.   

    要传递动态参数,用引号引起来干什么?
    ---------
    因为在SQL 语句中,日期型是当作字符来处理的。
    另外,给你一个建议,就是把有问题的SQL语句,输出,然后拿到SQL ANALYZER上
    去进行语法分析,这样就知道错在哪了。
      

  8.   

    括号是可要可不要的,我是没有办法,才括起来看看会不会好点。
    ClientDataset也没有问题,因为之前我对filter设置,是没有问题的,
    不过考虑效率,才改用SQL,但是改了之后就不行了。
    诸如语句ClientDataset.Parameters.ParamByName(recno).DataType := ftString;,我在设计状态下对ADOQuery和ClientDataset已经设置过了,而且还有Tparam.size属性。
    但就是不知道问题出在哪里
      

  9.   

    出错异常为:EOLEException,提示信息为:至少一个参数没有被指定值。
    我做了改动:
    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 ;
      

  10.   

    在开发环境中,直接在定义的参数的Value属性里赋值试一试可不可以。你的这个按说只要定义有相应数量的参数,象什么类型的其他什么都不用设置都该可以的。
      

  11.   

    你的错不在SQL语句上,错在把参数写在了客户端,你把参数写有服务器端就搞定了,我试了.
      

  12.   

    我调试过了,ClientDataset.Params.ParamByName(recno).AsString
    ClientDataset.Params.ParamByName('endDateTime').AsDateTime 
    ClientDataset.Params.ParamByName('startDateTime').AsDateTime
    都有值,而且正确,
    不过在执行Open语句时就出错!如果能解决问题,再奉送100分也没关系!!!!!问题我是最初我在ADOQuery.SQL中写带动态参数的查询语句,不是把参数写在了服务器端吗?两种情况我都试过了,都不行。
    看来,方法肯定可行,但是不知道是不是开发环境的问题,我用的是D6,不知是否
    有问题。或者别的地方出错了
      

  13.   

    强烈建议你在数据库的SQL工具中输入你上面的SQL语句,将三个参数换成实际值,看数据库能否正常反应,如果不行,变换参数值的形式,直到可行,学习该数据库系统对时间类型的处理采用何种方式,然后不同再回过头看程序中的query参数采用何种类型及方式传递。祝你好运!
      

  14.   

    ClientDataset.Params.ParamByName(recno).AsString:=strRecno;
    请改为ClientDataset.Params.ParamByName('recno').AsString:=strRecno;
    最好用ClientDataset.Params[0].AsString:=strRecno;
        
        
      

  15.   

    我试验了SQL语句,如果时间日期格式是短格式,也就是比如2001-1-1类型的
    是可以的,可以执行,但是如果时间日期格式为2001-1-1 10:00:00的时候,
    则提示:变量或者类型不正确,或者不在可以接受的范围内,要不就与其他数据冲突。时间日期如果是'2000-1-1'等带符号的则不能执行。
    不过上面查询只是在简单查询,比如dtt>=2000-1-1时可以执行,如果双重条件,比如dtt>2000-1-1 and dtt<2002-3-22,则虽然不提示出错,但是却不能查出数据,虽然存在有合乎条件的数据。
    我的查询必须带时间条件,我该怎么办?
      

  16.   

    我建议用如下格式
    ADOQuery.SQL:='select * from table1 where (recno = '''+IntToStr(recno)+''') and  (dtt <= '''+DateToStr(endDateTime)+''') and (dtt >='''+DateToStr(startDateTime)+''''
    自已构成SQL语句  DateToStr DateTimeToStr与设置的日期格式有关
      

  17.   

    另外库中存的日期格式 是否是 yyyy/mm/dd 还是yyyy/mm/dd 00:00:00
      

  18.   

    因为我选用的是长格式,所以是yyyy-mm-dd hh:mm:ss。ADOQuery.SQL:='select * from table1 where (recno = '''+IntToStr(recno)+''') and  (dtt <= '''+DateToStr(endDateTime)+''') and (dtt >='''+DateToStr(startDateTime)+''''
    这个恐怕要在ClientDataset才能用吧,要不参数怎样传过去?
      

  19.   

    everydayniceday(大卫) :
    我对你的帖子关注很多天,对于你的问题,我也没有很好的办法,不过你提醒了我一个很重要的、却一直在忽视的问题,那就是:在sql server中,对于日期时间型的字段,很难做出一个精确的比较!!!我觉得与其和它较劲,还不如将日期时间型的字段转成字符型(除了要精确到时间的字段),可能在客户段编程稍微麻烦了一点,但可以提高效率,由于转换的结果有你控制,还可以避免由于计算机设置造成的时间格式的不同,因为你很难保证你的每一个客户机及服务器均采用同样的设置我建议你这么处理。
      

  20.   

    呵呵,开玩笑了,分数无所谓,实在不知道该说什么了,问题确实奇怪。如果用长格式,为避免客户机区域设置中时间格式的影响,建议可以这样试一试:
    1、可以直接不用指定类型,用.value直接把字符串传递回去。
    2、客户端直接构造Sql语句的字符串,不用参数。你试验不能执行是用Query Analyzer里试验的吗,那就更不该有错了。
      

  21.   

    在SQL工具中试验SQL语句时,一定要保证数据库对SQL语句能进行正常正确的反应,得到正确的结果。如长格式不行,则可使用SQL语句中的时间函数对查询字段做相关处理。SQL语句能否通过并得到正常的结果是解决问题的关键。
      

  22.   

    我在设计环境下,设置clientDataset的参数的属性值Tparams[*].value,
    不过竟然还是提示出错。我实在没办法,就又用clientDataset.CommandText属性进行查询,
    时间日期长格式老出错,我就用了短格式yyyy-mm-dd,
    commandtext:='select * from table1 where dtt='+DateTimeToStr(dtDate);程序中第一次用到的地方没有问题,不过第二次调用的地方就
    提示出错:变量或者类型不正确,或者不在可以接受的范围内,要不就与其他数据冲突。
      

  23.   

    在clientDataset.Open前 clientDataset.FetchParams一下,以便正确传递参数。
      

  24.   

    要日期象这样,DateToStr(today())。
    注意,这个结果会跟系统区域设置里的设置相关。
    自己构造字符串吧,免得不一致。'select * from table1 where dtt='+DateTimeToStr(dtDate)
    不要引号可以吗,一般还是加上引号:
    'select * from table1 where dtt='+#39+DateTimeToStr(dtDate)+#39
      

  25.   

    呵呵,不好意思,写错了,日期是Datetime的整数部分
    DateToStr(Round(today()))
      

  26.   

    唉,又错,怎么能四舍务入,象DateToStr(trunc(now()))这样才可以。
      

  27.   

    在试验你的SQL语句时,建议采用短格式,并且为了确保SQL中的数据能正常反应, 使用SQL中的日期函数,形如:select * from table1 where date(dtt) ='2002-3-1'。SQL server中的日期函数不知是否如此,你查一下数据库相关的帮助。在DELPHI程序中不要使用datatimetostr函数为妙,直接使用字符串形式传递给SQL语句
      

  28.   

    最后对commandtext编写查询语句,解决了问题,不过还是绕了弯路,
    先sql,后过滤,得到想要的结果。
    其实对时间,至少对于access来说,要队时间加上#mydate#,才比较好用。再次向大家的支持表示感谢。多谢大家!