我的程序是这样写的:
with Adoquery3 do
begin
  Close;
  Sql.Clear;
  Sql.Add('Select xm from jc_ryjcxx where bm=:bm1 and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) =:sj1)');
  Parameters.ParamByName('sj1').Value:=DateTimePicker2.Date;//日期
  Parameters.ParamByName('bm1').Value:=Node2.Text;//部门字段
  Open;
  while not Eof do
  begin
    TreeVIew1.Items.AddChild(Node3,FieldByName('xm').AsString);
    Next;
  end;
end;
不知道是不是我SQL语句的问题还是ADOQUERY的问题。
在执行的时候我使用事件探察器跟踪显示是这样的:先执行EXISTS里面的SELECT,然后再整个执行一下SQL语句,在执行EXISTS里的SELECT的时候参数传递正常,当执行到整个这个SQL语句的时候,参数就残缺不全了。
谁能告诉我这是为什么,我错在那里了,谢谢大家!

解决方案 »

  1.   

    LEFT(jcsj, 10) =:sj1出错,你的数据库时间字段是varchar吧?
    改:
    Parameters.ParamByName('sj1').Value:=formatdatetime('yyyy-mm-dd',DateTimePicker2.Date);//日期
      

  2.   

    Parameters.ParamByName('sj1').AsString:= QuoteStr(DateToStr(DateTimePicker2.Date));//日期
    Parameters.ParamByName('bm1').Value:= QuoteStr(Node2.Text);//部门字段
      

  3.   

    楼上的星级同僚,将你的SELECT语句切份一下在执行,看看问题到底出在那里不就可以了吗?
      

  4.   

    soaringsouth(栈桥捉鳖):此前就是这样,如果这个都不会,就没脸上来问问题了。还有就是,如果把各个条件写在SQL语句里而不传递的话是没问题的。
      

  5.   

    我现在想知道的事情就是为什么在这样的SQL语句中为何传递参数会有问题。其实问题解决起来很简单,可能你也想到了,但这并不是我想要的答案。(楼上几位的方法都是不行!)
      

  6.   

    单引号问题。
    在SQLSERVER里能执行, 在DELPHI中就不行了,在DELPHI中  要加一个单引号,要用两个单引号。你在运行的时候打开之前加个showmesage(sql.text)看看,这个SQL语句是什么样子的,肯定不是完整的。这样Sql.Add('Select xm from jc_ryjcxx where bm=:'''+bm1+''''+' and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) =:'''+sj1+'''')');
      

  7.   

    这个东东我来搞定
    不要用参数
    肯定是先执行exist语句
    因为先要判断条件啊,由内向外执行
      

  8.   

    如果把各个条件写在SQL语句里而不传递的话是没问题的。————————————————————————————————————
    小风你说详细一点呀,
    你是说你直接写DateTimePicker2.Date 和 Node2.Text 就没错吗?
      

  9.   

    DateTimePicker2.Date 这个肯定是不对的,我拷贝过来的时候没来的及改!
    其他没错!我现在想知道的事情就是为什么在这样的SQL语句中为何传递参数会有问题。其实问题解决起来很简单,可能你也想到了,但这并不是我想要的答案!
      

  10.   

    这样试一试:with Adoquery3 do
    begin
      Close;
      Sql.Clear;
      Sql.Add('Select xm from jc_ryjcxx where bm=:bm1 and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) =:sj1)');
      Parameters.ParamByName('sj1').Value:=DateTimePicker2.Date;
    //DateToStr(DateTimePicker2.Date);你改一下。
      Parameters.ParamByName('bm1').Value:=Node2.Text;//部门字段
      Open;
      while not Eof do
      begin
        TreeVIew1.Items.AddChild(Node3,FieldByName('xm').AsString);
        Next;
      end;
    end;
    如果不可以的话,那么直接把参数代了进去,用一下SQL.SaveToFile('SQL.Txt');//之后放在查询分析器里边试一试。
    再者,你怎么Distinct和那么多的字段一起用???
      

  11.   

    Parameters[0].Value:=DateTimePicker2.Date;
    Parameters[1].Value:=Node2.Text;//部门字段or 
    Parameters[0].Value:=DateToStr(DateTimePicker2.Date);
    Parameters[1].Value:=Node2.Text;//部门字段
      

  12.   

    执行到整个这个SQL语句的时候,参数就残缺不全了。
    ——————————————————————————————
    这句话是什么意思?小风哥?
      

  13.   

    ihihonline(小小->沉沦中..........)阿轮,你在做程序的时候遇到过这样的情况吗?其实直接写进去而不用参数是可以的。
    但是我想知道为什么传参数的时候就不行呢?myling(阿德)就是说,他先执行子查询,然后再执行整个查询,明白吗?执行整个查询的时候参数就不完整了。
      

  14.   

    这比不是说不行,因为是动态的给定Parameters的,所以,有时它会发生混乱,而此时,如果用Parameters.ParamByName的话,就可能出现定位不对,那么用Parameters[0]......就相对的好一些,再者,Parameters对参数的类型要求不很严格,相当于一个变体类型,所以在设计期不进行检测,这样,如你上边的,Left(///)//对应的是一个时间类型的,那么它执行到这儿的时候可能就通不过,SQL Server 在对待时间类型上很好处理,字符型、FLoat都可以,都是如果以Delphi对应的话,就只能是DataTime。所以可能会出错。你要保证, 这个DataSet前期//设计期   没有Parameters。----------------
    沉沦中..........
      

  15.   

    那么小风哥,按照小小的Parameters[0]......这样行了吗?
      

  16.   

    Sql.Add('Select xm from jc_ryjcxx where bm=:bm1 and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) ='+quotedstr(yourstr)+')');
      

  17.   

    outer2000(天外流星):多谢老哥!
    myling(阿德):无效!
      

  18.   

    u2m(UpToMe)   呵呵,你的数据库滥那你在深圳靠什么吃饭?
      

  19.   

    不讨论了,初步认定是数据库版本问题,SQLSERVER7和SQLSERVER2000版本不同,我使用的是SQLSERVER2000,而在我同事的机器上就没有问题。
    特别感谢楼上各位的兄弟,结贴!
      

  20.   

    测试:数据库连接:
    Provider=SQLOLEDB.1;Password=dprogram;Persist Security Info=True;User ID=sa;Initial Catalog=Northwind;Data Source=DPROGRAM;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DPROGRAM;Use Encryption for Data=False;Tag with column collation when possible=False  with ADOQuery1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * From Employees where LastName <> ''Davolio'' and City <> :Value1 and Not ' +
          'Exists(Select Distinct CustomerID , EmployeeID , Left(OrderDate,10) as rq From ' +
          'Orders where CustomerID <> ''asdfasdf'' and EmployeeID <> 0 and Left(ShippedDate,10) <> :Value2)' );
        Parameters[0].Value := '1696-12-23';
        Parameters[1].Value := '1696-12-23';
        Open;
      end;测试成功
      with ADOQuery1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * From Employees where LastName <> ''Davolio'' and City <> :Value1 and ' +
          'Exists(Select Distinct CustomerID , EmployeeID , Left(OrderDate,10) as rq From ' +
          'Orders where CustomerID <> ''asdfasdf'' and EmployeeID <> 0 and Left(ShippedDate,10) <> :Value2)' );
        Parameters[0].Value := '1696-12-23';
        //Parameters[1].Value := '1696-12-23';
        Parameters.ParamByName('Value2').Value := '1696-12-23';
        Open;
      end;
    测试成功
      

  21.   

    我的就是SQL Server 2000的。也没有问题,问题是出在你的字段值里????
    比如说:取Null?----------------
    沉沦中..........