高手过来看看,这个SQL语句有什么问题?(100分)

  • 主题发起人 主题发起人 yangjj
  • 开始时间 开始时间
to 悟空:这样也不行!
 
if LCb1.text<>'' then begin
jh_fpb1.adoquery2.sql.clear;
jh_fpb1.adoquery2.sql.text:='SELECT jh_zb.jh_code, jh_zb.gc_name,'
+'jh_zb.zj_kind, jh_zb.xm_code, jh_zb.ys_bank, jh_zb.jh_data,'
+'jh_zb.dw_uint, jh_zb.pz_file, jh_zb.bb_unit, jh_zb.jb_person,'
+'jh_zb.bz_data, jh_zb.bz_memo, jh_fb.sb_code, jh_fb.sb_name,'
+'jh_fb.gg_type,jh_fb.jl_unit, jh_fb.sl_amount, jh_fb.dj_price,'
+'jh_fb.je_sum, jh_fb.gh_unit, jh_fb.jh_person, jh_fb.bz_memo1'
+' FROM jh_zb LEFT JOIN jh_fb ON jh_zb.jh_code = jh_fb.jh_code'
+' where jh_zb.code='''E1.text + ''' and jh_fb.jh_person='''+lcb1.text+''' order by jh_fb.sb_code ASC';
jh_fpb1.adoquery2.open;
如果字段类型为数值类型则去掉单引号
不好意思,,因为这里要分行写了,所以忘了加引号
改正如上。。
 
TO YANGJJ:
改了:
你再试试看。。
 
我绝的错误应该在where语句后面。可以改用参数的方式进行处理。
WHERE jh_zb.code=:@A1 AND jh_fb.jh_person=:@A2 ORDER BY jh_fb.sb_code ASC
ParamByName('a1').AsString:=...;
ParamByName('a2').AsString:=...;
open;
 
procedure Tjh_fpprint1.SpeedButton1Click(Sender: TObject);
begin
if LCb1.text<>'' then begin
with jh_fpb1.adoquery2 do begin
sql.clear;
sql.add('SELECT jh_zb.jh_code, jh_zb.gc_name, ');
sql.add('jh_zb.zj_kind, jh_zb.xm_code, jh_zb.ys_bank, jh_zb.jh_data, ');
sql.add('jh_zb.dw_uint, jh_zb.pz_file, jh_zb.bb_unit, jh_zb.jb_person, ');
sql.add('jh_zb.bz_data, jh_zb.bz_memo, jh_fb.sb_code, jh_fb.sb_name, ');
sql.add('jh_fb.gg_type,jh_fb.jl_unit, jh_fb.sl_amount, jh_fb.dj_price, ');
sql.add('jh_fb.je_sum, jh_fb.gh_unit, jh_fb.jh_person, jh_fb.bz_memo1 ');
sql.add('FROM jh_zb LEFT JOIN jh_fb ON jh_zb.jh_code = jh_fb.jh_code ');
sql.add('where jh_zb.code='''+ E1.text + ''' and jh_fb.jh_person='''+lcb1.text+'''');
sql.add('order by jh_fb.sb_code');
open;
end;
end;
end;
用上面这段不会出错的!
 
还是说一下解决问题的思路吧。
你先别轻易的sql.add('SELECT jh_。。。');
你先将SQL语句写到一个字符串变量里去strSql:='Select ...',
然后再sql.add(strSql),这样你可以在执行OPEN前,得到STRSQL的值,
你将他贴到SQL ANALYSER(等类似的查询分析器中),看看你的SQL语句对不对。
再逐步的找错误。

对于SQL语句中的单引号的处理要写一个函数
FUNCITON MARKIT(STR:STRING):STRING;
BEGIN
RESULT:=''''+STR+'''';
END;
这样写程序就清晰多了。
strSql:='select * from urtable where code='+markit(edit1.text);
query1.sql.clear;
query1.sql.add(strsql)
query1.open
 
to chinaplate:
想看STRSQL的值,用不着变量,在ADD()完所有的语句后,看SQL.TEXT就可以了。
 
dlnew:
是这样的,但我认为,有一个变量更好,程序显的干静一些,是吧。
 
to chinaplate:
你说的也有道理。
但用变量有一个限制,即字符串长度不能超过一定的值,不是吗?
一般的,如果我遇到这种出错的长的SQL语句,就在FORM上放一个MEMO,然后在OPEN语句的前(或后)
加一句
MEMO1.TEXT := SQL.TEXT;
调试完成后把它注释掉就可以了。
 
多人接受答案了。
 
后退
顶部