比较简单的一条嵌入查询,在查询分析器里能查出正常记录,而在delphi却不能,
详情如下:
1、查询分析器里:
select * from gps_carinfor where gps_carcorp=(select id from gps_carteam where gps_carteamname='一车队');
查询结果正常
2、delphi里
      carteam :='一车队';
      sql.Add('select * from gps_carinfor where gps_carcorp=(select id from gps_carteam where gps_carteamname=:tname)');
      parameters.ParamByName('tname').Value := carteam;
查不出记录来而把sql语句改为
sql.Add('select id from gps_carteam where gps_carteamname=:tname');
或'select * from gps_carinfor where gps_carcorp=1'
都能查出正常的结果。什么原因,期待解答

解决方案 »

  1.   

    继续奇怪
        carteam :='一车队';
        sql.Add('select * from gps_carinfor where gps_carcorp=(select id from gps_carteam where gps_carteamname='''+carteam+''')');
    这样也正常
      

  2.   

    你的carteam的值是  一车队  这个字符串,
    而在sql语句里要查询出结果,carteam的值应为 '一车队'
    多加几个引号吧
      

  3.   

    楼上的,carteam 本就是'一车队'
    因为
    sql.Add('select id from gps_carteam where gps_carteamname=:tname');
    parameters.ParamByName('tname').Value := carteam;结果是正常的
      

  4.   

    是不是adoquery不支持这里涉及的什么东西?不支持嵌入式查询里面传参数???
      

  5.   

    你當然不對阿,在 delphi的sql語句的''裡面為一個双引號表示一個單引號,多加單引號就對了example:
        sql.add('select * from table where id='''+edit1.text+'''');
        你的問題:sql.add('select *from table where .....''1車隊''');就可以了
      

  6.   

    请仔细看一下我写的各种情况,我觉得不是这个问题。
    那不是字符串的参数,都不能这样传了?为什么把sql语句分开写就没问题?
      

  7.   

    知道了,你把parambyname('tname').value 改成.asstring就可以了。
    多加引号也能解决问题
      

  8.   

    现在主要奇怪的是:
          //sql.Add('select * from gps_carinfor where gps_carcorp=(select id from gps_carteam where gps_carteamname=:tname)');//结果不正常
          
          sql.Add('select * from gps_carteam where gps_carteamname=:tname');//结果正常
          parameters.ParamByName('tname').Value := carteam;
      

  9.   

    我刚才查了些资料,有人说这是ado的bug,嵌套查询用parameters传参数就是不行。根据多中情况,我觉得问题在这里:
    carteam初始赋值为  '一车队'经过赋值操作
    parameters.ParamByName('tname').Value := carteam;后传入sql语句中的不是'一车队'而是别的,可能被截断了。怎么看赋完值要执行的sql语句的字符串?
      

  10.   

    可能是DELPHI封装ADO原生对象的BUG,建议直接用语句,1,“后传入sql语句中的不是'一车队'而是别的,可能被截断了”:多出现与TCLIENTDATASET控件,当然也不排除ADOQUERY会出现;2,你可以在SQL事件跟踪器里,查看执行的SQL语句!!!!不好意思,没帮上忙!!!
      

  11.   

    果然如此!!!
    跟踪结果:select * from gps_carinfor where gps_carcorp=(select id from gps_carteam where gps_carteamname='一'果然是传参数时的bug那就只能用别的方式查询了吗?
      

  12.   

    这样改一下
    //adodb.pas
    function VarDataSize(const Value: OleVariant): Integer;
    begin
      if VarIsNull(Value) then
        Result := -1
      else if VarIsArray(Value) then
        Result := VarArrayHighBound(Value, 1) + 1
      else if TVarData(Value).VType = varOleStr then
      begin
        //Result := Length(PWideString(@TVarData(Value).VOleStr)^);
        Result := Length(PAnsiString(@TVarData(Value).VOleStr)^);
        if Result = 0 then
          Result := -1;
      end
      else
        Result := SizeOf(OleVariant);
    end;
      

  13.   

    to lw549(那个孩子他爹):不行啊,我修改了那个函数后保存,再编译我的程序,还是不行。是不是我做的不对?
      

  14.   

    http://bbs.ee.ntu.edu.tw/boards/Programming/10/2/13.html
      

  15.   

    回复人: cjf1009(农民程序员) ( ) 信誉:97  2005-02-22 18:19:00  得分: 0  我前几天也发现这个情况,跟你几乎差不多。传的参数被截断成只有一个汉字。
    另外,还有一点,如果传的参数是英文,就不会出错。
    应该是bug 吧。
    我后来也只是把语句改成
        carteam :='一车队';
        sql.Add('select * from gps_carinfor where gps_carcorp=(select id from gps_carteam where gps_carteamname='''+carteam+''')');
    这样的形式。
      

  16.   

    关于bug的介绍
    http://www.nssoft.net/showdoc.asp?did=1200
      

  17.   

    >>数据库是sqlserver 2000这个是支持的,将你的参数直接代实际的数值进去看如何再说
      

  18.   

    to: aiirii(ari-爱的眼睛) 直接代实际的数值进去,结果是正常的。用传参数的方法,跟踪所执行的sql语句是:
    跟踪结果:select * from gps_carinfor where gps_carcorp=(select id from gps_carteam where gps_carteamname='一'所以结果不正确