我目前是如下这样写, 但感觉很多不方便,只能用于简单的语句,主要是不方便跟参数走. 因为有时候语句非常大。请教诸位,要带参数走的sql 执行过程要怎么写呢?表名也是灵活的,字段有多有少,并不固定,希望大侠能指点小弟。怎么写最实用,最方便。
procedure TDtModule.LrSearch(a:string);
begin
       with adoquery1 do
    begin
       close;
       sql.clear;
       sql.add(a);
       exesql;
    end;
end;

解决方案 »

  1.   

    在sql sever里写个存储过程。
      

  2.   

    建议楼主参考一下C#中SQLHELPER设计思想
      

  3.   

    写一个简单的供参考
    procedure TForm1.Open_Data(aDataSet:Tadoquery;aSQL:string;aParm:array of Variant);
    var i:integer;
    begin
       with aDataSet do
       begin
           close;
           sql.clear;
           for i:=Low(aParm) to High(aParm) do
             parameters[i].value"=aParm[i];
           open;
       end;
    end;procedure TForm1.Button1Click(sender:TObject);
    var aSQL_Parm:array of Variant;
    begin
       setlength(aSql_Parm,2);
       aSQL_Parm[0]:=2;              //整型参数
       aSQL_Parm[1]:='2011-4-24';    //日期型参数
       Open_Data(adoquery1,'select * from NCG_Dwmc where dw_ID=:dw_ID or sh_Rq>:SH_Rq ');
    end;//有多种返回值的方式,楼主可以举一返三,尝试一下。执行存储过程可以只传递一个存储过程名及参数列表即可。如果要传递连接参数,也可以将过程中加入一个如Tadoconnection进去。
      

  4.   

    上面parameters[i].value"=aParm[i];应改为:
    parameters[i].value:=aParm[i];
      

  5.   

    我是通过定义一个常量的sql语句,然后利用format函数给sql中值赋值,然后将format后的语句给adoquery执行操作的 
    例如
    const
      s1 = 'delete from relaysence where NetId = %d and DeviceId = %d and SenceId = %d';
    var
      sql1: string;
    begin
      sql1 := Format(s1, [1,2,3]);
      with adoquery1 do
      begin
      close;
      sql.clear;
      sql.add(sql1);
      ...//执行数据库sql语句后的相关操作
      end;
    end;
    不知楼主是否是这个意思,或有更好的方法一起学习学习 呵呵