动态的生成SQL语句,我的想法是通过一个函数输入一个控制状态的参数,输出SQL语句,在函数里面用array把备用的SQL语句段放好然后根据不同的状态参数来自由的组合,这中间有一个小问题,就是LIKE的问题,like字符的时候要加‘’而‘’中间的是一个变化的值我想用DELPHI中的SQL参数:para来传递但是试了一下不行,:para好象必须要在同一对‘’里面才能认出来我这样的结构DELPHI不认  '....like '+''''+:para+'''';
不知道聪明的CSDN DELPHI块网友有什么好的办法?

解决方案 »

  1.   

    是否可以先将动态生成的SQL语句全部串好后放在一个String变量中,再做操作呢?
      

  2.   

    CBC的form_main->adoquery->SQL->Add(" DEPART='"+cmbDepart->Text+"'");
      

  3.   

    楼上的办法其实我自己实现过的就是在最后要查询的时候对like后面的赋值就是把''''+string+''''等写上去。我希望的是能直接用SQL里面的变量在like中查询,这个能做到吗?我突然想到是否可以把like后面的''''+string+''''等做为整体在写like的时候这样写是否可以
    '....like :para'
    然后对para赋值
    para := ''''+string+''''
    这个想法可行吗?
      

  4.   

    是可以的!
    sql.add('........like :aa');
    parameters.parambyname('aa').value:=string+'%';
    open;
      

  5.   

    说错了
    应该是
    sql.add('........like :aa');
    parameters.parambyname('aa').value:=quoedstr(rstring+'%');//quoedstr转化字符串类型
    open;
      

  6.   

    ha ha 
    (@ $ @)
      

  7.   

    sqlstr:='....... like '''+string+'''';
      

  8.   

    angle097113(深思不解) 
    你说的方法我试了可以编译通过但是没有结果,但是我在数据库中直接用SQL查询是有结果的。不知道为什么?你试试看?
      

  9.   

    sql.add('........like :aa');
    parameters.parambyname('aa').value:=string+'%';不能用 QuotedStr(string+'%')
      

  10.   

    尽量少用动态生成的SQL语句的方法,
    那样比较容易出错。用楼上的方法比较好。
      

  11.   

    hiflower(花) 
    你的方法你在DELPHI下面写个简单的TEST看看,没有结果的,我试了不行的。
      

  12.   

    procedure TForm1.Button6Click(Sender: TObject);
    begin
      with ADOQuery1 do
      begin
        SQL.Clear;
        SQL.Text:='SELECT * FROM Factory where factoryname like :aa';
        Parameters.ParamByName('aa').Value:='f%';
        open;
      end;
    end;没有任何问题,选出了以 f 开头的所有厂名。
      

  13.   

    hiflower(花) 
    真的很奇怪啊,在你写的TEST之前我就是这样写的啊,但是没有结果,表头SELECT出来了,但是没记录。这个我就不懂了但是我这样写
    adoquery1.sql.add('select * from slider where sl_code like '+''''+'N%'+'''');
    这样是可以的但
    adoquery1.sql.add('select * from slider where sl_code like :para');
    adoquery1.parameters.parameterbyname('para').value := 'N%';
    却不行没有结果,我用的D6这个不会是个BUG吧?
      

  14.   

    这个我不太清楚了。之前有没有 adoquery1.Close;adoquery1.sql.clear;呢?把 para 换成 APara 再试呢?
      

  15.   

    Northwindrocker (北风) 
    ADOQuery1.Clear;
    ADOQuery1.SQL.Add(' Select * From TableName Where FieldName Like :dd');
    ADOQuery1.Parameters.ParamByName('dd').DataType :=ftString;
    ADOQuery1.Parameters.ParamByName('dd').Size:=30;
    ADOQuery1.Parameters.ParamByName('dd').Value:='%';
    ADOQuery1.Open;
    OK;
      

  16.   

    这个我以前做过.
    procedure TForm1.Button6Click(Sender: TObject);
    begin
      with ADOQuery1 do
      begin
        SQL.Clear;
        SQL.Text:='SELECT * FROM Factory where factoryname like :aa';
        Parameters.ParamByName('aa').Value:='f'+%;(此处是最为重要的就为+%)
        open;
      end;
    end;
      

  17.   

    這個是有一個BUG放的位置不同有時就有出錯