Delphi TDBXTransaction'无效的事务对象'

时间:2012-10-17 18:59:01

标签: oracle delphi transactions dbexpress

第一关我是德尔福的新手所以这可能是一个“平凡的细节”,正在被看过。 [提前抱歉]

当我尝试通过连接到 Oracle 11g数据库的datasnap服务器运行事务时,出现'Invalid Transaction Object'错误。

由于系统详细信息和公司业务计划,我们选择不使用 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 个答案:

答案 0 :(得分:3)

通过调用SQLCon.DBXConnection.BeginTransaction(),您将绕过内部TTransactionItem的设置,当您在SQLConnection对象上调用SQLcon.CommitFreeAndNil()时提交事务时会检查该内部DBXConnection。请注意,您在SQLCon.DBXConnection.BeginTransaction() 对象上启动了事务,但没有同样提交它。

替换

SQLCon.BeginTransaction()

{{1}}

答案 1 :(得分: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

请尝试此操作并报告结果。