首先,我是Delphi的新手,所以这可能是一个“世俗的细节”,已经被人们忽略了。 [对不起]

当我尝试通过连接到Oracle 11g DB的数据快照服务器运行事务时,出现'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;

最佳答案

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

更换

SQLCon.DBXConnection.BeginTransaction()




SQLCon.BeginTransaction()

10-04 18:38