有关用QUERY控件,实现动态SQL语句访问MSSQL(100分)

  • 主题发起人 主题发起人 pyh_jerry
  • 开始时间 开始时间
P

pyh_jerry

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用动态SQL向一个MSSQL表插入或编辑记录,我的SQL插入记录的语句是这样的:
insert news
(...字段列表)
values
(:字段名,:字段名,...);
然后在用:
parame[0].asstring:='abc'
parame[1].asdate:=date();
...
不知为什么要报错,而且有两三种错误.各位老大帮帮我啦:(

 
把你的错误告诉一下吧。
你的写法是对的!!!
你把变量直接替换为SQL语句直接运行呢?
对吗?

 
把你的源码贴出来吧!
 
源码出来才好分析呀
 
with Query do begin
SQL.Clear;
SQL.Add('select * from news');
SQL.Add('where XWLBID=:XWLBID,XWSJ=:XWSJ,BZXM=:BZXM,'+
'SYRQZ=:SYRQZ,NRGS=:NRGS,XWURL=:XWURL,BZ=:BZ)');
Params[0].AsString:=IntToStr(NewsType.Items.IndexOf(NewsType.Text));
Params[1].AsDate:=Date();
Params[2].AsString:=Editor.Text;
Params[3].AsString:=Checker.Text;
Params[4].AsString:=Content.Text;
Params[5].AsString:=URL.Text;
Params[6].AsString:=Memo.Text;
ExecSql;
end;
 
错误是找不到这些字段的变量。:xwblid
如果先写在sql编辑器中就可以,但这就不属于动态的了:(
 
1.'SYRQZ=:SYRQZ,NRGS=:NRGS,XWURL=:XWURL,BZ=:BZ)'
~~~~我觉得这里是不是多了个')'
2.你是不是可以用
ParamByName('syrqz').AsString:=....
之类的试试
 
用ExecSQL不太確切, 雖然不會發生錯誤, 但也得不到數據的, 這也是個問題
另外, 注意空格 From News 與 Where 之間是否有Space.
其它的問題, 其他人以為你指出了.
 
我觉得你这样写代码就可以了:
query.close;
query.sql.clear;
query.sql.add('insert into news (XWLBID,XWSJ,BZXM,SYRQZ,NRGS,XWURL,BZ)');
query.sql.add('values("'+IntToStr(NewsType.Items.IndexOf(NewsType.Text)+'",
"'+DataToStr(Date())+'","'+Editor.text+'","'+Checker.Text+'",
"'+Content.Text+'","'+URL.Text+'","'+Memo.Text+'"');
//(弄成一行,绝对可以)
query.sql.execsql;

 
你试下加
Params[0].NAME:='XWLBID'
Params[1].NAME:='XWSJ'......
最后加个prepare方法试下,我这样写可以的
 
注意QUERY1的REQUESTLIVE要设置成TRUE,然后你的写法也有问题,既然是往TABLE中插入数据
那么写法就不是你那样了,参照YANLIANG的做法看是否可以!
 
如果动态的SQL,自然参数也要动态呀!!下面是我的一个例子
datamodule1.Qexesql.Close;
datamodule1.Qexesql.sql.clear;
datamodule1.qexesql.Params.Clear;
datamodule1.qexesql.Params.CreateParam (ftString,'stocker',ptInput);
datamodule1.qexesql.Params.CreateParam (ftString,'stock',ptInput);
datamodule1.qexesql.Params.CreateParam (ftString,'work_date',ptInput);
datamodule1.qexesql.Params.CreateParam (ftInteger,'work_num',ptInput);
datamodule1.qexesql.Params.CreateParam (ftfloat,'work_price',ptInput);
datamodule1.qexesql.Params.CreateParam (ftfloat,'work_fee',ptInput);
datamodule1.qexesql.Params.CreateParam (ftString,'info_guid',ptInput);

datamodule1.qexesql.sql.add('insert into tb_object_1154(ob_object_id,ob_release_date_1154,f1_1154,f2_1154,f3_1154,f5_1154,f6_1154,f7_1154,f10_1154,f13_1154)');
datamodule1.qexesql.sql.add('values (f_createclassid(),"NOW",:stocker,:work_date,:stock,"3",:work_num,:work_price,:work_fee,:info_guid)');

datamodule1.qexesql.ParamByName ('stocker').asstring:=stock_usr;
datamodule1.qexesql.ParamByName ('stock').asstring:=stock_id;
datamodule1.qexesql.ParamByName ('work_num').asinteger:=access_num;
datamodule1.qexesql.ParamByName ('work_date').asstring:=work_date;
datamodule1.qexesql.ParamByName ('work_price').asfloat:=work_price;
datamodule1.qexesql.ParamByName ('work_fee').asfloat:=access_fee;
datamodule1.qexesql.ParamByName ('info_guid').asstring:=info_guid;

然后执行datamodule1.qexesql.execsql;
 
to yanliang:
你的方法是一个很容易出错的方法,如果假设某个eid.text里有"'",就会出现单引号匹配
错误了。而且这种方法容易写错,而且传递参数非常不方便,甚至有些无法传递。
to Jackwinner:
如果是更新操作,必须使用EXECSQL。
to pyh_jerry:
如果还有其他错误,贴出错误信息,你前面说的错误“找不到这些字段的变量。:xwblid”
这个错误就是你写法错误。没有创建任何的参数。自然它不认识。并且它的报错是仅仅做
第一个参数不存在的报错信息。

 
谢谢大家,现在的问题是:明明表中有符合条件的字段就是找不到!!而在单机的ORACLE
数据库编程中,则是正确的,(下面的这个程序是在C/S的MSSQL中才出错,不是单机的)
with query do begin
close;
sql.clear;
Params.CreateParam (ftString,'bzxm',ptInput);
sql.add('select * from dbo.news where');
sql.add('(bzxm=:bzxm)');
params[0].AsString:=edit1.Text;
active;//execsql,open;用open时报找不到object.
end;//随便问一下,这种情况可以用存储过程吗?
 
呵呵,谢谢大家,搞定了。这样就可以了:)
with query do begin
close;
sql.clear;
sql.add('SELECT XWLBID, XWSJ, BZXM, SYRQZ, NRGS, XWURL, BZ ');
sql.add('FROM dbo.News ');
sql.add('WHERE (BZXM = :temp)');
params[0].AsString:=edit1.Text;
open;
end;//太怪了!!!
 
后退
顶部