这样的事务处理有错么?帮忙看看(100分)

  • 主题发起人 主题发起人 qiubole
  • 开始时间 开始时间
Q

qiubole

Unregistered / Unconfirmed
GUEST, unregistred user!
begin
if not datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.BeginTrans;

datasource1.DataSet.Post;
//随行人数;
sqlstr:='Update room Set 状态=''在住'',折后价='+dbedit13.Text+',住客姓名='''+dbedit3.text+''',住客编号='''+datasource1.DataSet.fieldbyname('编号').AsString+''',入住日期='''+dbedit11.Text+''','+'随行人数='
+dbedit7.Text+',入住天数='+dbedit14.Text+' where 房间号='''+trim(dbedit1.Text)+'''';
with datamodule2.CommQuery2 do
begin
try
close;
sql.Clear;
sql.Add(sqlstr);
execsql;
except
application.MessageBox('更新数据出错,数据将不保存','错误');
showmessage(sqlstr);
if datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.RollbackTrans;
exit;
end;
end;
if datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.CommitTrans;
application.MessageBox('保存成功','提示');
bitbtn5.Enabled:=false;
button1.Enabled:=true;
bitbtn3.Enabled:=true;
end;
在该程序中用到了一个事务处理;用于对两个表的更改进行统一控制,其中
datasource1.DataSet.Post为表1的修改;datamodule2.CommQuery2为对表2的修改;

请大家看看,提提建议
 
if datamodule2.ADOConnection1.InTransaction then //这句没有必要
datamodule2.ADOConnection1.RollbackTrans;

两个DataModule只要使用的ADOConnnection是同一个即可达到这个目的。


if datamodule2.ADOConnection1.InTransaction then //像这样你不觉得哆嗦吗?
datamodule2.ADOConnection1.CommitTrans;
如果你程序只有一个线程应当没有必要这样写
 
稍微修改了一下,程序如下:
主要是:如果出错,尽量要RollBack,然后再显示提示对话框,否则,你的事务永远不会中止,知道他按了OK。
还有,尽量考虑周全一些,CommitTrans也可能出错。

begin
if not datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.BeginTrans;

try
datasource1.DataSet.Post;
//随行人数;
sqlstr := 'Update room Set 状态=''在住'',折后价=' + dbedit13.Text + ',住客姓名=''' + dbedit3.text + ''',住客编号=''' + datasource1.DataSet.fieldbyname('编号').AsString + ''',入住日期=''' + dbedit11.Text + ''',' + '随行人数='
+ dbedit7.Text + ',入住天数=' + dbedit14.Text + ' where 房间号=''' + trim(dbedit1.Text) + '''';
with datamodule2.CommQuery2 do
begin
try
close;
sql.Clear;
sql.Add(sqlstr);
execsql;
except
showmessage(sqlstr);
if datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.RollbackTrans;
application.MessageBox('更新数据出错,数据将不保存', '错误');
exit;
end;
end;
if datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.CommitTrans;

application.MessageBox('保存成功', '提示');

except
if datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.RollbackTrans;
application.MessageBox('更新数据出错,数据将不保存', '错误');

end;

bitbtn5.Enabled := false;
button1.Enabled := true;
bitbtn3.Enabled := true;
end;

 
我建议使用
if datamodule2.ADOConnection1.InTransaction then
datamodule2.ADOConnection1.RollbackTrans;
这样能够更完善一些![8D]
 
多人接受答案了。
 
后退
顶部