在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的原排版格式也得以保留,引号的问题也不用特别处理。相当的方便。
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的原排版格式也得以保留,引号的问题也不用特别处理。相当的方便。
解决方案 »
- 大家帮助我很急..........
- 如何实现鼠标放置位置的图标的操作提示?(在线等待!)
- ======访问COM组件,通过的端口能否改变,在线等待~=======
- 用IdWinsock这个unit要什么dll
- 救急!!!SQL Server2000恢复时总是提示“数据库在使用……”
- 那为大侠了解delphi6.0dbexpress控件组,如果知道给几贴。
- 请教在DELPHI中调用DLL的问题(20分)
- 哪儿有李维的<<Delphi5.x分布式多层应用系统篇>>,<<Delphi5.x分布式多层应用电子商务篇>>,<<Delphi5.x高效率应用系统篇>>....
- interbase的默认用户和密码是什么,急
- 启动NT的远程访问服务问题
- 动态改变主窗体,mdi和form
- delphi+quickrep 编译的exe文件不能在其他机器上运行
最好的做法:做一个函数,将所有sql存在文件中,并且可以在文件中使用变量的值替换
sql文件中存放的sql语句的动态值,那样你还可以随时修改sql,而不用修改执行程序
编辑sql也方便多啦。
不过说白了,不管是你那样,还是我这样,其实都是脱了裤子放屁——多此一举,因为你
又不是要做个查询分析器,没有必要要经常修改sql的啦
还有,你要真嫌麻烦,或格式不好看,你也可以再做一个工具,将指定sql语句按照delphi的
语法,转为delphi的标准形式,比如字符引号的处理等,然后copy上去,不就行了。
还搞个memo,呵呵,没有学习价值。
你所说的脱裤子放屁的事,我全部都做过,甚至还把SQL语句存在数据库的某个表中,看我Blog中的FlexQue就是这样干的了。
可能是工作性质有点不同,我真的是经常要去修改SQL语句,另外,再重申一次,用SP当然可以解决很多问题,但一来私密性不太好,二来,不是什么数据库我都有权限用SP的。
不过要在运行期间修改sql,最好就是象楼上说的,用存储过程啦
+'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) + ')';一般我就用这样的格式,太长拉的话也用用存储过程(很少)
[
Id,
QuotedStr(StrName),
....
]);