ado_query语句提交的问题,麻烦看一下程序(50分)

  • 主题发起人 主题发起人 chshanghai
  • 开始时间 开始时间
C

chshanghai

Unregistered / Unconfirmed
GUEST, unregistred user!
麻烦费点时间看一下下面的程序. (sql 语句肯定没问题)
try
with table_data.ADO_Query do begin
//完工入库配件:写
sql.clear;
sql.add('insert into tb_wgrkmx(frkdjh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj) ');
sql.Add('select :v_rkdh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj from tb_pjjhmx ');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
execsql;
//完工入库单据:写
sql.Clear;
sql.add('insert into tb_wgrkdj(frkdjh,fydjh ,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq)');
sql.add('select :v_rkdh,fjhdh,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq from tb_pjjhdj ');
sql.add('where fjhdh=:v_jhdh');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
parameters.ParamByName('v_jhdh').value:=trim(dbedit1.Text);
execsql;
table_data.ado_yydw.CommitTrans ;
end;//with
except
table_data.ado_yydw.RollbackTrans ;
error('[配件入库] 并库不成功');
end; //try
为什么只能提交貌一新“ 完工入库单据 ” 而 " 完工入库配件 "不能提交
但不加事务后即: 下面的两个都能提交
with table_data.ADO_Query do begin
//完工入库配件:写
sql.clear;
sql.add('insert into tb_wgrkmx(frkdjh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj) ');
sql.Add('select :v_rkdh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj from tb_pjjhmx ');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
execsql;
//完工入库单据:写
sql.Clear;
sql.add('insert into tb_wgrkdj(frkdjh,fydjh ,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq)');
sql.add('select :v_rkdh,fjhdh,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq from tb_pjjhdj ');
sql.add('where fjhdh=:v_jhdh');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
parameters.ParamByName('v_jhdh').value:=trim(dbedit1.Text);
execsql;
table_data.ado_yydw.CommitTrans ;
end;//with
为什么样????? 我都快疯了 ....
 
给点建议也行,难道没人用过吗?
???
 
再没人回答,我跳楼了
 
本来您的设计思路就有不合理的地方!
首先您可以将两句SQL语句作为一个ADOCommand的CommandText,如此才可以,并且只需要
调用一次执行即可。而且也可以得到完整的事务保护。
清您少用ADOQuery,它有BUG,我吃过苦头。
希望能够对您有所帮助。
 
ADO QUERY有个不知道是不是BUG的问题,就是在写SQL语句之前,必须先CLOSE,而BDE则
没有这个必要。对于你的问题,可以改写如下?

try
with table_data.ADO_Query do begin
//完工入库配件:写
close;
sql.clear;
sql.add('insert into tb_wgrkmx(frkdjh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj) ');
sql.Add('select :v_rkdh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj from tb_pjjhmx ');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
execsql;
//完工入库单据:写
close;
sql.Clear;
sql.add('insert into tb_wgrkdj(frkdjh,fydjh ,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq)');
sql.add('select :v_rkdh,fjhdh,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq from tb_pjjhdj ');
sql.add('where fjhdh=:v_jhdh');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
parameters.ParamByName('v_jhdh').value:=trim(dbedit1.Text);
execsql;
table_data.ado_yydw.CommitTrans ;
end;//with
except
on e:exception do
begin
table_data.ado_yydw.RollbackTrans ;
error('[配件入库] 并库不成功');
end;
end; //try
为什么只能提交貌一新“ 完工入库单据 ” 而 " 完工入库配件 "不能提交
但不加事务后即: 下面的两个都能提交
with table_data.ADO_Query do begin
//完工入库配件:写
close;
sql.clear;
sql.add('insert into tb_wgrkmx(frkdjh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj) ');
sql.Add('select :v_rkdh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj from tb_pjjhmx ');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
execsql;
//完工入库单据:写
close;
sql.Clear;
sql.add('insert into tb_wgrkdj(frkdjh,fydjh ,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq)');
sql.add('select :v_rkdh,fjhdh,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq from tb_pjjhdj ');
sql.add('where fjhdh=:v_jhdh');
parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
parameters.ParamByName('v_jhdh').value:=trim(dbedit1.Text);
execsql;
table_data.ado_yydw.CommitTrans ;
end;//with
 
对,adoquery有问题的,好象adotable好一些
 
哈哈,也有人遇到这个问题了!
adoquery好象是这样的,我也没装升级包,只是使用了存储过程解决了这个问题.
 
同意liaotw,我也碰到过同样的问题,改成AdoCommand就行了.建议作insert,delete操作时最
好用AdoCommand,select 时用AdoQuery.
 
我试试,谢谢各位的救命之恩
。。。。这样我就不要从一楼跳到0楼了
 
to: liaotw
按你说的我用ado_command 如下:
但出现错误:'parameter object is improperly defined...'
麻烦各位给我看看,为什么会有这样的错误


with table_data.ADO_COMMAND do begin
//完工入库配件:写
commandtext:='';
commandtext:='insert into tb_wgrkmx(frkdjh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj) ';
commandtext:=commandtext+'select :v_rkdh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj from tb_pjjhmx '+#13;
//完工入库单据:写
commandtext:=commandtext+'insert into tb_wgrkdj(frkdjh,fydjh ,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq) ';
commandtext:=commandtext+'select :v_rkdh,fjhdh,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq from tb_pjjhdj ';
commandtext:=commandtext+'where fjhdh=:v_jhdh';

parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
parameters.ParamByName('v_jhdh').value:=trim(dbedit1.Text);

execute;
end;//with
 
commandtext中的参数需在使用时预先定义到ADOQuery的Params中
 
to :jonpo
你说
commandtext中的参数需在使用时预先定义到ADOQuery的Params中
是什么意思
你的意思是:
commandtext中的参数需在使用时预先定义到ADOcommand的Params中
是码, 是这样的吗
 
是的。如果你的参数不需要运行时改变,可在设计时定义,需要的话则可在运行时定义
如:
var
Mparam:TParameter;
begin
Mparam:=ADOQuery1.Parameters.AddParameter;
Mparam.DataType:=YourFieldType;
Mparam.Value:=YourValue;
end;
 
to jonpo
不好意思再问一下
奇怪为什么样adoquery和其它的控件都不用这样,但adocommand却需要
而且其它书上也没有介绍过
adoquery只要用parameters.parambyname 就可以了.

 
因为adoquery.commandtext不象adoquery.SQL一样会自动定义参数对象。
你不妨试一下.
 
to jonpo ,按你说得不是不行
with table_data.ADO_COMMAND do begin
//完工入库配件:写
commandtext:='';
commandtext:='insert into tb_wgrkmx(frkdjh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj) ';
commandtext:=commandtext+'select :v_rkdh,fckdm,fpjdm,fpjmc,fpydm,fjhsl,fdw,fsqdj,fshdj from tb_pjjhmx '+#13;
// parameters.ParamByName('v_rkdh').value:=trim(v_rkdjh);
//完工入库单据:写
commandtext:=commandtext+'insert into tb_wgrkdj(frkdjh,fydjh ,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq) ';
commandtext:=commandtext+'select :v_rkdh,fjhdh,fcjdm,fcjmc,ffphm,fywy,fczy,fzje,fyfje,fsl,fjsfs,fbz,fjhrq from tb_pjjhdj ';
commandtext:=commandtext+'where fjhdh=:v_jhdh';
params:=Parameters.AddParameter;
params.Name:='v_rkdh';
params.DataType:=ftString;
params.Value:=trim(v_rkdjh);

params:=Parameters.AddParameter;
params.Name:='v_jhdh';
params.DataType:=ftString;
params.Value:=trim(dbedit1.text);
execute;
end;//with
 
问题解决了,请关闭讨论
 
多人接受答案了。
 
后退
顶部