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;
3
Troy Harris 17 październik 2012, 22:59

2 odpowiedzi

Najlepsza odpowiedź

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()
3
Sertac Akyuz 17 październik 2012, 23:50

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ę:

http://docwiki.embarcadero.com/Libraries/Tokyo/en/Data.SqlExpr.TSQLConnection.RollbackIncompleteFreeAndNil

Spróbuj tego i zgłoś wyniki.

0
Wellington1993 15 czerwiec 2018, 22:07