一个比较难控制的问题, 急 !!!!!!(20分)

  • 主题发起人 主题发起人 my_first1
  • 开始时间 开始时间
M

my_first1

Unregistered / Unconfirmed
GUEST, unregistred user!
c/s结构, sql server7.0

两个相同的表。 编号字段bh,图象字段image
with adoquery1 do
append;
dbimage1.Picture.LoadFromFile(Openpicturedialog1.FileName);
post; //执行到 1
end;

with adoquery2 do
append;
fieldbyname('image').value:=adoquery1.fieldbyname('image').value;
post; //执行到2
end;

问题是:
  由于图像很大,有几M, 有可能在(执行到1)时通过了。 但(执行到2)这里时,
却由于(网络线路忙,连接不通),失败  这样就一个表有数据, 另外一个表就没有数据。

怎样能控制这种情况的发生。 
我想过用事务处理能解决这种问题吗?  

只有两个表都添加成功才算 正确.

谢谢各位, 急!
 
事物处理是可以的,一步没有完成,则取消修改。
 
用事务真的可以吗? 我目前是通过ado 访问数据库。 但这个ado, 在网络不通的情况下。

经常死机, 数据传输到中途,就报你网络忙, 这样数据的结构就不正确。

以前从来没有用过事务, 我该怎样写呢? 用什么语句。 以前看过一点点。 
谢谢各位指导!
 
var sucsess:boolean;
try
with adoquery1 do
beginTransaction;//具体是那个方法既不清了,查一下帮助吧!
append;
dbimage1.Picture.LoadFromFile(Openpicturedialog1.FileName);
post; //执行到 1
success:=true;
end;

with adoquery2 do
beginTransaction;//具体是那个方法既不清了,查一下帮助吧!
append;
fieldbyname('image').value:=adoquery1.fieldbyname('image').value;
post; //执行到2
success:=true;
end;
except
adoquery1.rollback;
adoquery2.rollback;
success:=false;
end;

if success then begin
adoquery1.commit;
adoquery2.commit;
end;
 
adoquery1.rollback;
adoquery2.;

没有这个属性commit,rollback是不是要定义什么类型后才可以使用
 
用事务可以做到的。不过最好要用Adoconnection。
Adoconnection。BeginTrans
try
with adoquery1 do
append;
dbimage1.Picture.LoadFromFile(Openpicturedialog1.FileName);
post; //执行到 1
end;

with adoquery2 do
append;
fieldbyname('image').value:=adoquery1.fieldbyname('image').value;
post; //执行到2
end;
adoconnection.CommitTrans;
except
adoconnection.RollbackTrans;
end;
 
楼上的方法可以。到要注意adoquery的connection要设置为adoconnection.
不过最好最保险有效的方法是用存储过程。
 
如果是并发,事物处理怎么写啊。
以上这个例子的时间比较长,不可能是锁定表吧。
锁行的话要先产生关键ID,浪费ID的编号。有没有其他方法啊。
以为我的分不多,我加50分。
 
如果两个QUERY是用一个联接,可以,否则不能!
在用一个联接时:
ADOCONNECT.BEGINTRAN
QUERY1.APPEND();
QUERY1.POST();
IF POST不成功,
ADOCONNECT.ROLLBACK;

QUERY2.APPEND();
QUERY2.POST();
IF POST不成功,
ADOCONNECT.ROLLBACK;
ADOCONNECT.COMMIT;
不知说清楚了没有!
试试!
 
后退
顶部