首先,我是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()