我用param来写的sql
commandtext := 'select * from xxx where colvalue in (:aparam)';
parambyname('aparam').value := atext;类似这样的方式
其中atext 是一个字符串,string或者widestring,传入的实际参数大概是'a', 'b', 'c'这样的单步到parambyname那一步的时候,确定atext是'a', 'b', 'c',但是通过跟踪发现,变成了''a'', ''b'', ''c'',造成结果与预期不符合不知何故我用的是D7,SQL SERVER2K的数据库先放50分,不够追加

解决方案 »

  1.   

    atext是字符串,
    :aparam不是数组,你想实现的是数组
      

  2.   

    你这里不过就一个参数,为什么要用in呢。
    commandtext := 'select * from xxx where colvalue=:aparam';
    parambyname('aparam').value := atext; 这样试试不可以吗
      

  3.   

    楼上的看错了吧
    LZ是想通过一个参数将in 的条件全部传进去吧
    但是param在赋值的时候将'转义了, 字符窜中''代表一个'
    所以变成了''a'', ''b'', ''c''
      

  4.   

     atext赋值的确保'a','b','c'样式
     'select * from xxx where colvalue in ('+atext+')'; 
      

  5.   

    楼主有没有测试过执行后的结果?还是只看CommandText的内容?另外看看所使用的控件本身是不是有什么选项可以配置的。
      

  6.   

    你想实现在结合中存在的值就返回,对吗?
    这样赋值,试试atext:=''''+'a'+''''+','+''''+'b'+''''+','+''''+'c'+'''';
    parambyname('aparam').value := atext; 如果不行,你可以把跟踪commandtext的值,剪切出来,在查询分析器中运行,直到调试成功。
      

  7.   

    试过,还是老样子另外说明一下
    ''a'',''b'',''c''这些是我通过sqlserver的事件探查器截取到的信息我不知道这样会不会是正常,但是查询的结果肯定是不正常(没有找出我想要的数据)
      

  8.   


    事实上我就是这么写的而且把SQL通过查询分析器来执行完全没有问题,当然,SQL里的参数是换成实际值后再查询分析器中使用的
      

  9.   

    多问一句,atext是怎么来的?如果是从文本框手工输入或者读取的,不要使用'',而只使用一个'就可以。
      

  10.   


    从一个列表中读过来的,某个对象的某个字段,通过代码拼接而成a
    b
    c
    ...'a' + 'b' + 'c'
    因为是string类型的,所以作为SQL参数的时候,我加了单引号
      

  11.   

    直接拼SQL语句,
    如果用param会在整个参数上加''号
      

  12.   

    应该是这种情况,不过也会将其中的单引号'变为两个单引号''.建议对于这种拼接,不要使用Parameter.
      

  13.   

    LIKE %*%
      

  14.   

    like 跟 in是两个完全不同的适合范围。
    like表达的是模糊匹配,in是判断是否在一个有限的范围内。
      

  15.   

    你想实现在结合中存在的值就返回,对吗? 
    这样赋值,试试 atext:=''''+'a'+''''+','+''''+'b'+''''+','+''''+'c'+''''; 
    parambyname('aparam').value := atext; 如果不行,你可以把跟踪commandtext的值,剪切出来,在查询分析器中运行,直到调试成功。
      

  16.   

    直接拼SQL语句atext:=''''+'a'+''''+','+''''+'b'+''''+','+''''+'c'+''''; 
    commandtext := 'select * from xxx where colvalue in ('''+atext+''')'; 
      

  17.   

    不要使用parambyname
    直接在SQL语句中加入字符串,'select * from xxx where colvalue in ('+atext+')'
      

  18.   

    try__again 我知道你的意思
    你是要求查询参数是不确定的,个数也是不确定的,这实际是涉及到SQL查询参数是动态变化的,个数也是动态变化的.
    我们首先分析一下你的语句:
    commandtext := 'select * from xxx where colvalue in (:aparam)'; 
    parambyname('aparam').value := atext; 
    但这样在运行时,'select * from xxx where colvalue in (:aparam)'就会并且只会被解释成'select * from xxx where colvalue =:aparam'问题解决:
       分析知,查询语句是字符串,那我们就可以利用字符串的特点,添加参数个数.
       具体实现可以考虑以下语句:
       ADOQuery.SQL.add("select * from xxx where colvalue in (:para " + IntToStr(i))
       你先看一下,自己能不能解决.
       
      

  19.   

    我把以前的开发笔记中曾遇到的关于该问题整理了一下,放在我的博客里:SQL查询语句中参数个数和参数值双重动态变化
    http://publishblog.blogchina.com/blog/tb.b?diaryID=6735099 
      

  20.   

    具体实现如下: 
          ADOQuery.SQL.add("select * from xxx where colvalue in (:para " + IntToStr(i))    这样在运行时,语句将被解释成 select * from xxx where colvalue =:parai ,参数变成parai而不是para. 仅这样是不够的,当只有一个参数时,上述查询语句是正确的,但当有多个参数时,参数之间是要加","隔开的.        采用循环可实现:       //n表示实际参数个数,可以动态变化      ADOQuery.close ;      ADOQuery.SQL.clear ;     ADOQuery.SQL.add("select * from xxx where colvalue in (:para " + IntToStr(0)) ;     //当参数个数多于2个     for i:=0 to n-1 do          ADOQuery.SQL.add(' ,:para ' + IntToStr(i)) ;    //为SQL语句末尾加上右括号     ADOQuery.SQL.add(' )') ;     //然后只要利用ADOQuery.Parameters[i].value为所有参数赋值即可
      

  21.   


    感谢!我现在也是这个思路,仍然采用commandtext和parambyname只是由于改动的地方较多,故还没下手我想这样做应该可行
    如果有更好的方法,请各位指教
      

  22.   

    我的博客
    http://wjbmcsd.bokee.com/
      

  23.   

    atext = 'a,b,c,d'var
      listParam : TStrings;
      strSql : String;
      i : Integer;
    begin
      listParam := TStringList.Create(nil);
      listParam.Delimiter := ',';
      listParam.DelimitedText := atext;
      if(listParam.Count > 0)then
      begin
        strSql:= 'select * from xxx where colvalue in(';  
        for i := 0 to listParam.Count - 1 do
        begin
          strSql := strSql + ':param' + IntToStr(i);
          if(i <> listParam.Count - 1) then
            strSql := strSql  + ', ';
        end;
        strSql := strSql  + ')';
        commandtext := strSql;
        for i := 0 to listParam.Count - 1 do
          parambyname('param' + IntToStr(i)).value := listParam.Strings[i];
      end;
    end
      

  24.   

    atext := ' ''a'',''b'',''c'' ' ;
    如果是赋给值按 atext  := ''''+s+''''形式赋给 ;ADOQuery.SQL.text := 'select * from xxx where colvalue in ('+atext+') ' ;