在Delphi中要用使用数据库,要使用SQL语句,我想每个稍为用Delphi写过程序的人都会知道怎么用,举个ADO的例子来说var
 qry : TADOQuery;
begin
  qry := TAdoQuery.Create(nil);
  qry.Connection := cnn;
  qry.SQL.add('select * from ta where id = :id');
  qry.Parameters.ParamByName('id').Value := 123;
  qry.open;
....

如果查询语句比较简单的,那么用上面的方法确实也没有什么问题,但如果SQL语句是比较复杂的,可能就会这个样子了:sqlcore := 'select age, icdm10, ta.*  from BAGL_BA2 , ( ' +
              'select jzh, riqi, fph, jine, sbje,  nvl(sbje, 0) - nvl(other_sum, 0) as sbsfje, jsfs ' +
              'from fp1 where fpbz <> ''2'' ' +
              'and riqi >= to_date(:bd1, ''yyyymmdd'') ' +
              'and riqi < to_date(:ed1, ''yyyymmdd'') ' +
              'union all select jzh, riqi, yddh, -ydje,sbje, 0 as sbsfje, jsfs from tf ' +
              'where riqi >= to_date(:bd2, ''yyyymmdd'') ' +
              'and riqi < to_date(:ed2, ''yyyymmdd'') ' +
              ') ta where bagl_ba2.jzh(+) = ta.jzh ';  
              
qry.SQL.Add(sqlcore); 

或者直接用qry.SQL.Add逐句增加也行,但工作量不会减轻多少(几乎没有区别)。
在这里要注意空格以外,还要注意原来要用引号的地方,特别的麻烦,而且SQL的原排版格式也全废掉了。如果语句日后要作修改的话,那就更加麻烦了。
曾经有几位用PowerBuilder的朋友对我说,他们对Delphi这种方式相当讨厌,因为在PB里面可以内嵌SQL脚本,写SQL语句时相当的舒服,他们老是劝我用PB。但我对使用PB完全没有兴趣,而且我用Delphi也不止是为了写数据库的软件。
最近,我发现一个比较好的解决方法,如某个Form中要用一句比较复杂的SQL语句(不要说要用View,有些时候View不能解决问题的,SP也是一样的道理),那么在这个Form上面加上一个memo控件,把它的visible设为false,另在memo.lines属性中把要写的SQL语句原样贴进去,接着在程序中就这样写var
 qry : TADOQuery;
begin
  qry := TAdoQuery.Create(nil);
  qry.Connection := cnn;
  qry.SQL.add(memo1.Text);
  qry.Parameters.ParamByName('id').Value := 123;
  qry.open;
....

这样处理之后,要修改SQL的话就直接在memo中改就行了,而且SQL的原排版格式也得以保留,引号的问题也不用特别处理。相当的方便。

解决方案 »

  1.   

    谢谢楼主的分享,不错哈...不过单独增加一个memo控件是否有点浪费哦?
      

  2.   

    是,是有点大材小用,也有点浪费的问题,但我觉得这点内存的消耗对比消耗时间来整理SQL语句要划算得多。
      

  3.   

    呵呵,你这个一点创意都没有啦。
    最好的做法:做一个函数,将所有sql存在文件中,并且可以在文件中使用变量的值替换
    sql文件中存放的sql语句的动态值,那样你还可以随时修改sql,而不用修改执行程序
    编辑sql也方便多啦。
    不过说白了,不管是你那样,还是我这样,其实都是脱了裤子放屁——多此一举,因为你
    又不是要做个查询分析器,没有必要要经常修改sql的啦
    还有,你要真嫌麻烦,或格式不好看,你也可以再做一个工具,将指定sql语句按照delphi的
    语法,转为delphi的标准形式,比如字符引号的处理等,然后copy上去,不就行了。
    还搞个memo,呵呵,没有学习价值。
      

  4.   

    to :wgzymzx 
    你所说的脱裤子放屁的事,我全部都做过,甚至还把SQL语句存在数据库的某个表中,看我Blog中的FlexQue就是这样干的了。
    可能是工作性质有点不同,我真的是经常要去修改SQL语句,另外,再重申一次,用SP当然可以解决很多问题,但一来私密性不太好,二来,不是什么数据库我都有权限用SP的。
      

  5.   

    呵呵,不好意思,昨天的话过份了一点^_^
    不过要在运行期间修改sql,最好就是象楼上说的,用存储过程啦
      

  6.   

    sqlstr:= 'insert into CKGL_CRKMXB(WZCODE,IN_NUM,CKMXBZH,WZZL,JHID,CPCODE,'
              +'IN_DJ,TZH,WZMC,WZGG,WZXH,WZDW,WZCZ,IN_MONEY,LYID,SLID,JLJYID,CKDJID,NUM)'
              + 'values( ''' + FieldByName('WZCODE').AsString 
              + ''', ''' + FieldByName('IN_NUM').AsString
              + ''',''' + FieldByName('CKMXBZH').AsString 
              + ''',''' + 'WL'   //FieldByName('WZZL').AsString
              + ''',''' + FieldByName('JHID').AsString
              + ''',''' + FieldByName('CPCODE').AsString
              + ''',''' + FieldByName('IN_DJ').AsString
              + ''',''' + FieldByName('TZH').AsString 
              + ''',''' + FieldByName('WZMC').AsString
              + ''',''' + FieldByName('WZGG').AsString 
              + ''',''' + FieldByName('WZXH').AsString
              + ''',''' + FieldByName('WZDW').AsString 
              + ''',''' + FieldByName('WZCZ').AsString
              + ''',' + FloatToStr(FieldByName('IN_NUM').AsFloat * FieldByName('IN_DJ').AsFloat)          + ', ''' + FieldByName('LYID').AsString
              + ''',''' + FieldByName('SLID').AsString
              + ''',''' + FieldByName('JLJYID').AsString          + ''', ''' + EditNum.Text  + ''',' + IntToStr(num) + ')';一般我就用这样的格式,太长拉的话也用用存储过程(很少)
      

  7.   

    为什么不用Format呢?Sql := Format('insert into AAA(id,name.....) Values(%d,%s,%d,%s,%s....)',
                 [
                   Id,
                   QuotedStr(StrName),
                   ....
                 ]);