使用ADO中的事务往SQLSERVER中插入数据时,为什么只有最后一行提交了(再线等待) 但是去除了事务直接写却可以提交全部的数据。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 beginif (clientdataset1.State = dsedit) thenclientdataset1.Post ;trydatamodule1.adoconnection1.BeginTrans ;clientdataset1.First ;while not clientdataset1.Eof do {把在CLIENTDATASE1中的所有数据都添加到RK的表中。}beginwith datamodule1.adoQuery1 dobeginclose;sql.Clear ;sql.add('insert jihuabiao(xuhao,bianhao,tuhao,mingcheng,shuliang,jindu,moxingchang,zhuzaochang,leixing,linghao,jihuabeizhu)');sql.add('values(:xuhao,:bianhao,:tuhao,:mingcheng,:shuliang,:jindu,:moxingchang,:zhuzaochang,:leixing,:linghao,:jihuabeizhu)');Parameters.ParamByName('xuhao').Value :=jhxuhao;Parameters.parambyname('bianhao').Value :=edit1.text;Parameters.parambyname('tuhao').Value :=clientdataset1.fieldbyname('tuhao').AsString ;Parameters.parambyname('mingcheng').Value :=clientdataset1.fieldbyname('mingcheng').AsString ;Parameters.parambyname('shuliang').Value :=clientdataset1.fieldbyname('shuliang').Asfloat;Parameters.parambyname('jindu').Value :=clientdataset1.fieldbyname('jindu').Asdatetime ;Parameters.parambyname('moxingchang').Value :=clientdataset1.fieldbyname('moxingchang').AsString ;Parameters.parambyname('zhuzaochang').Value :=clientdataset1.fieldbyname('zhuzaochang').AsString ;Parameters.parambyname('leixing').Value :=clientdataset1.fieldbyname('leixing').AsString ;Parameters.parambyname('linghao').Value :=clientdataset1.fieldbyname('linghao').AsString ;Parameters.parambyname('jihuabeizhu').Value :=clientdataset1.fieldbyname('beizhu').AsString ;execsql;end;clientdataset1.Next ;end;datamodule1.ADOConnection1.CommitTrans ;clientdataset1.enablecontrols;exceptif datamodule1.ADOConnection1.InTransaction thendatamodule1.adoconnection1.RollbackTrans ;showmessage('错误,请检查输入是否正确');clientdataset1.enablecontrols;end;end; 楼主把事务提交放到了循环语局的外边,这个事务就不怎么起作用了,因每一行都执行了一次execsql,到了最后一条才退出循环,然后CommitTrans 提交事务,很明显这个事件只对最后一个execsql起作用;估计这就是你问了为什么的原因,把你的事务处理放到while的里边试试吧 如果把事务的开始放到WHILE中,达不到预期的要求,我想是把所有的临时表中的数据都添加到SQLSERVER中,有错误全部回滚的。如果添加到WHILE 中那么只对应的是一条纪录而已。再一个事务中只能有一个EXECSQL吗,我记得以前使用BDE时,可以执行多个EXECSQL的。这次我是第一次使用ADO。代码也是以前BDE中的。在BDE中应该是可以的呀 如何删除类型文件里的一条记录? 简单问题 离开 论坛 散分【二】 急!!!请高手帮忙修改一个http代理程序! 关于动态生成treeview节点的问题 求助:请问哪有Exporter控件组下载 Delphi的数据库的中文输入问题100分相送!!! 请问10进制换成16进制用什么函数? 尴尬中..... 请教一个怪问题,多谢各位大虾 急,请各位大狭指点, ADO怎么访问有密码的ACCESS数据库?
if (clientdataset1.State = dsedit) then
clientdataset1.Post ;
try
datamodule1.adoconnection1.BeginTrans ;
clientdataset1.First ;
while not clientdataset1.Eof do {把在CLIENTDATASE1中的所有数据都添加到RK的表中。}
begin
with datamodule1.adoQuery1 do
begin
close;
sql.Clear ;
sql.add('insert jihuabiao(xuhao,bianhao,tuhao,mingcheng,shuliang,jindu,moxingchang,zhuzaochang,leixing,linghao,jihuabeizhu)');
sql.add('values(:xuhao,:bianhao,:tuhao,:mingcheng,:shuliang,:jindu,:moxingchang,:zhuzaochang,:leixing,:linghao,:jihuabeizhu)');
Parameters.ParamByName('xuhao').Value :=jhxuhao;
Parameters.parambyname('bianhao').Value :=edit1.text;
Parameters.parambyname('tuhao').Value :=clientdataset1.fieldbyname('tuhao').AsString ;
Parameters.parambyname('mingcheng').Value :=clientdataset1.fieldbyname('mingcheng').AsString ;
Parameters.parambyname('shuliang').Value :=clientdataset1.fieldbyname('shuliang').Asfloat;
Parameters.parambyname('jindu').Value :=clientdataset1.fieldbyname('jindu').Asdatetime ;
Parameters.parambyname('moxingchang').Value :=clientdataset1.fieldbyname('moxingchang').AsString ;
Parameters.parambyname('zhuzaochang').Value :=clientdataset1.fieldbyname('zhuzaochang').AsString ;
Parameters.parambyname('leixing').Value :=clientdataset1.fieldbyname('leixing').AsString ;
Parameters.parambyname('linghao').Value :=clientdataset1.fieldbyname('linghao').AsString ;
Parameters.parambyname('jihuabeizhu').Value :=clientdataset1.fieldbyname('beizhu').AsString ;execsql;
end;
clientdataset1.Next ;
end;
datamodule1.ADOConnection1.CommitTrans ;
clientdataset1.enablecontrols;
except
if datamodule1.ADOConnection1.InTransaction then
datamodule1.adoconnection1.RollbackTrans ;
showmessage('错误,请检查输入是否正确');
clientdataset1.enablecontrols;
end;
end;
因每一行都执行了一次execsql,到了最后一条才退出循环,然后
CommitTrans 提交事务,很明显这个事件只对最后一个execsql起作用;
估计这就是你问了为什么的原因,把你的事务处理放到while的里边试试吧
再一个事务中只能有一个EXECSQL吗,我记得以前使用BDE时,可以执行多个EXECSQL的。
这次我是第一次使用ADO。代码也是以前BDE中的。在BDE中应该是可以的呀