首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi XE +DBX+SQL Server2008 关于事务回滚有关问题

2012-03-07 
Delphi XE +DBX+SQL Server2008 关于事务回滚问题请问有没有人知道dbexpress + SQL Server 客户端提交数据

Delphi XE +DBX+SQL Server2008 关于事务回滚问题
请问有没有人知道dbexpress + SQL Server 客户端提交数据如何处理事务?
我客户端用的TSQLConnection来连接,但是不知道怎么处理事务,在网上找了一些方法都不适用。
请告知 dbexpress + SQL Server 的事务回滚方法
我用过的方法

方法一:
var
  tran:TDBxTransaction;
begin
  try
  tran:= dm.SQL_Conn.BeginTransaction(TDBXIsolations.ReadCommitted);
  dm.cds_DBXQuery.Close;
  dm.cds_DBXQuery.CommandText:=xxx;
  dm.cds_DBXQuery.Execute;
  dm.SQL_Conn.CommitFreeAndNil(tran);//执行到这里报raised exception class 
  //EDatabaseError with message 'Invalid transaction Object'.
  except
  On e:Exception do
  begin
  dm.SQL_Conn.RollbackFreeAndNil(tran);
  raise;
  end;
  end;
end;

----------------

方法二: 虽然执行不抱错,但是并没有回滚

var
  tran:TTransactionDesc;
begin
  try
  tran.TransactionID:=1;
  tran.IsolationLevel:=xilREADCOMMITTED;
  dm.cds_DBXQuery.Close;
  dm.cds_DBXQuery.CommandText:=xxx;
  dm.cds_DBXQuery.Execute;
  dm.SQL_Conn.Commit(tran);//替换成 dm.SQL_Conn.Rollback(tran);测试回滚,但遗憾的是没有报错也没有回滚
  except
  On e:Exception do
  begin
  dm.SQL_Conn.Rollback(tran);
  raise;
  end;
  end;
end;


[解决办法]
最好写在存储过程里面 在存储过程去回滚... 


本来回滚就是因为数据连接有问题,你还在Delphi 里面回滚貌似不太好吧.
[解决办法]
有可能BeginTransaction无效,
或者上个事务还没执行完,开始新事务前,最好先判断一下事务的状态

[解决办法]
我的也是XE + sql2008,没有问题

Delphi(Pascal) code
varTransaction: TDBXTransaction;OwnsTransaction: Boolean;OwnsTransaction := not Connection.InTransaction;if OwnsTransaction then  Transaction := Connection.BeginTransaction;try  ...     if OwnsTransaction then    Connection.CommitFreeAndNil(Transaction);except  if OwnsTransaction then    Connection.RollbackFreeAndNill(Transaction);end;
[解决办法]
客户端回滚,如楼上的楼上onlyou13(流浪哥哥)提供的处理代码,
服务器存储过程回滚:
Create procedure [dbo].[XXXX]
(...)
AS
 BEGIN TRAN
 if (...) 
 begin
ROLLBACK TRAN
select 'Error!'
RETURN 1
 end
 ......

 SELECT '保存完成!'
 COMMIT TRAN
 RETURN 0

热点排行