Delphi中的TDBXTransaction出现“无效事务对象”错误

3

首先,我是Delphi的新手,可能会忽略一些“平凡的细节”(提前道歉)。

当我尝试通过连接到Oracle 11g数据库的数据捕获服务器运行事务时,我遇到了一个“无效的事务对象”错误。

由于系统细节和公司业务计划,我们选择不使用ClientDataSets来处理事务。相反,我们试图使Snap服务器非常通用,并且只通过接收查询并返回本机类型来处理数据访问。

话虽如此,这里有一些示例代码,让我感到困扰:

function TSnapMethods.TransUpdate: boolean;
var
  dbx: TDBXTransaction;
  params:TParams;
begin
  SqlCon.Open;
  dbx := SQLCon.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
  try
      params:= TParams.Create(self);
      with Params.AddParameter do
      begin
        name:= 'param';
        DataType:= ftWideString;
        ParamType:= ptInput;
        asString:= 'Bugsville';
      end;
      with Params.AddParameter do
      begin
        name:= 'var';
        DataType:= ftWideString;
        ParamType:= ptInput;
        asString:= 'ZZZTOP';
      end;
      sqlcon.Execute('Update Name set City=:param Where Abrv=:var',params);

      SQLcon.CommitFreeAndNil(dbx);//Breaks here...
      result:= true;
  except
    Sqlcon.RollbackFreeAndNil(dbx);//Breaks here also...
    result:= false;
  end;        
end;
2个回答

3
通过调用 SQLCon.DBXConnection.BeginTransaction(),您跳过了在调用SQLcon.CommitFreeAndNil()时检查事务是否被提交的内部TTransactionItem的设置。请注意,您正在DBXConnection对象上开始事务,但没有同样地提交它。
SQLCon.DBXConnection.BeginTransaction()

使用

SQLCon.BeginTransaction()

0

我从另一个来源得到了这个有用的信息: http://codeverge.com/embarcadero.delphi.ide/record-not-found-or-changed-by-another/1061559

开始事务:

transaction:=Datamodule.SqlConection.BeginTransaction(TDBXIsolations.ReadCommitted);

提交:

DataModule1.SqlConection.CommitFreeAndNil(Transacao);

回滚操作:

DataModule1.SqlConection.RollbackIncompleteFreeAndNil(Transacao)  

使用

RollbackIncompleteFreeAndNil

代替

RollbackIncompleteFreeAndNil

如所引用的:

http://docwiki.embarcadero.com/Libraries/Tokyo/en/Data.SqlExpr.TSQLConnection.RollbackIncompleteFreeAndNil

请尝试并报告结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接