ADO中如何控制事务?(100分)

  • 主题发起人 主题发起人 Beyond2002
  • 开始时间 开始时间
B

Beyond2002

Unregistered / Unconfirmed
GUEST, unregistred user!
With ADOQuery Do
Begin
Close;
SQL.Text := 'DELETE FROM Table1 ';
ExecSQL;
Close;
SQL.Text := 'INSERT INTO Table1 ' ...;
ExecSQL;
End;
不知怎么回事,第一句(DELETE ...)没执行,到底应该如何控制事务?
 
用adoconnection連到adoquery,用adoconnection的事務﹐begintrans,committrans
 
对不起!完整的代码应该是:
ADOConnect.BegTrans;
Try
With ADOQuery Do
Begin
Close;
SQL.Text := 'DELETE FROM Table1 ';
ExecSQL;
Close;
SQL.Text := 'INSERT INTO Table1 ...' ; //省略若干
ExecSQL;
End;
ADOConnect.Committrans;
Except
ADOConnect.Rollbacktrans;
End;
执行的结果是主键冲突,好像是第一句没成功,但也没有异常提示
 
好象省略的語句有問題
 
SQL.Text := 'DELETE FROM Table1 ';
改为
SQL.Text := 'DELETE FROM Table1 where ...';有条件删除

SQL.Text := 'truncate table table1'; 全部删除
 
ado 事務就是如此,用兩個不同的ado query就可以了
 
SQL语句绝对没问题,因为第一次运行(此时Table1表中没有数据)时INSERT成功了,
而且我删除的时候是有条件删除的,但就是没删掉
TO skywareyu79:如果我有3条SQL语句岂不是要3个ADOQuer控件,更多呢?
 
ExecSQL有返回值啊!
 
ExecSQL执行了吗?
它执行以后,不会返回值,或者说是返回值不反映在用户端,
它只在服务端执行,结果你看不到。
你可以试试:
adoquery.active := false;
sql.text := '';
adoquery.active := true;
应该可以看到执行结果了
 
不会把,Active是要返回数据的,例如Select。。。的语句,而ExecSQL返回的值是表示SQL语句
影响的数据条数,例如:Delete,Update等语句
 
有可能是你插入的主键重复哦!
仔细检查一下!
 
TO LUCKWZY:
INSERT时只有一条记录,不会重复!
 
这样试试看看.
ADOConnect.BegTrans;
Try
With ADOQuery Do
Begin
Close;
sql.clear;
sql.add('delete from table1');
ExecSQL;
Close;
sql.clear;
sql.add('insert into table1...');
ExecSQL;
End;
ADOConnect.Committrans;
Except
ADOConnect.Rollbacktrans;
End;
 
To jbas:
和上面的有什么区别吗?
 
ADOConnection.BeginTrans;
try
... // 需要处理的事务代码
except
... // 相关处理
if ADOConnection.InTransation then
ADOConnection.RollbackTrans;
end;
if ADOConnection.InTransation then
ADOConnection.CommitTrans;
[:D]
 
ADO好像很不稳定,前些天还好好的,又出现Bof/Eof错误(装了ADO的2#升级包),
Delphi5重装就好了,要是交付用户后出现这种情况可怎么办???
 
With ADOQuery Do
Begin
Close;
SQL.add := 'DELETE FROM Table1 ';
open;
Close;
SQL.add := 'INSERT INTO Table1 ' ...;
open;
End;
 
有可能是你要删除的表是另外一个表的父表或者是从表,如果当是删除其中的一个表是不
行的,还有一种方法你用后台数据库的编程语言来试一试。如:后台是sql2000用存储过程
来实现
 
后退
顶部