Po pierwsze, jestem nowy w Delphi, więc może to być „przyziemny szczegół”, który jest pomijany. [z góry przepraszam]
Otrzymuję błąd 'Invalid Transaction Object'
, gdy próbuję przeprowadzić transakcję przez serwer datasnap połączony z bazą danych Oracle 11g.
Ze względu na szczegóły systemu i biznesplan firmy postanowiliśmy nie używać ClientDataSets do obsługi naszych transakcji. Zamiast tego staramy się, aby serwer Snap był bardzo ogólny i obsługiwał dostęp do danych tylko przez odbieranie zapytań i zwracanie typów natywnych.
Mając to na uwadze, oto przykładowy kod, który pasuje do mnie:
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 odpowiedzi
Wywołując SQLCon.DBXConnection.BeginTransaction()
, omijasz ustawienie wewnętrznego TTransactionItem
, które jest sprawdzane, gdy transakcja jest zatwierdzana, kiedy wywołujesz SQLcon.CommitFreeAndNil()
na obiekcie SQLConnection. Zauważ, że rozpoczynasz transakcję na obiekcie DBXConnection
, ale nie zatwierdzasz jej w podobny sposób.
Zastąpić
SQLCon.DBXConnection.BeginTransaction()
Z
SQLCon.BeginTransaction()
Z innego źródła otrzymałem tę pomocną informację: http://codeverge.com/ embarcadero.delphi.ide/record-not-found-or-changed-by-another/1061559
Do rozpoczęcia transakcji:
transaction:=Datamodule.SqlConection.BeginTransaction(TDBXIsolations.ReadCommitted);
Za zobowiązanie:
DataModule1.SqlConection.CommitFreeAndNil(Transacao);
Aby wycofać:
DataModule1.SqlConection.RollbackIncompleteFreeAndNil(Transacao)
I użyć
Wycofanie NiekompletneBezpłatneIZerowe
Zamiast
Wycofanie NiekompletneBezpłatneIZerowe
Jak, do którego odwołuje się:
Spróbuj tego i zgłoś wyniki.
Podobne pytania
Nowe pytania
oracle
Oracle Database to wielomodelowy system zarządzania bazami danych stworzony przez Oracle Corporation. NIE używaj tego znacznika w przypadku innych produktów należących do Oracle, takich jak Java i MySQL.