第一关我是德尔福的新手所以这可能是一个“平凡的细节”,正在被看过。 [提前抱歉]
当我尝试通过连接到 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;
答案 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
喜欢引用:
请尝试此操作并报告结果。