Autor Téma: FreeAndNil(Query) - nezničí ho  (Přečteno 368 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4223
  • Karma: 37
    • Verze Delphi: XE7 professional
FreeAndNil(Query) - nezničí ho
« kdy: 12-04-2019, 10:30:09 »
Kód: [Vybrat]

procedure TfrmRenumber.RoomsCopy;
begin
    dtmdMain.fdtrPoBesUpdate.StartTransaction;
    CopyRoom;
    CopyRenameRoom;
    CopyPerson;
    CopyData;
    CopyUpdateTree;
    dtmdMain.fdtrPoBesUpdate.Commit;
end;
V jednotlivých funkciách si vytváram lokálne Query. Pokiaľ sú typu UPDATE, tak sa vo funkcii FreeAndNil nezničia.
Predpokladám, že to je zapríčinené/spojené s nepotvrdenou transakciou.
Je môj predpoklad správny? Ak áno, ako to mám správne riešiť?
Viem to urobiť tak, že Query nebudú lokálne vo funkciách a tu uvedenú funkciu rozšírim o ich zničenie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4223
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:FreeAndNil(Query) - nezničí ho
« Odpověď #1 kdy: 12-04-2019, 13:39:13 »
Podľa všetkého je predpoklad zlý. Zrada je niekde inde ale neviem ju nájsť :'(
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4223
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:FreeAndNil(Query) - nezničí ho
« Odpověď #2 kdy: 12-04-2019, 14:21:16 »
Tak som to konečne našiel. Volal som funkciu, kde si vytváram, ale neničil som Qry.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1759
  • Karma: 68
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:FreeAndNil(Query) - nezničí ho
« Odpověď #3 kdy: 13-04-2019, 00:44:16 »
FireDAC spousti SQL prikazy pod posledni nastartovanou transakci a nezalezi na tom zda se objekt jenz prikaz spustil uvolni protoze je prikaz s hodnotami parametru odeslan DBMS v dobe volani spousteci metody (jako napr. ExecSQL). Jinak doufam, ze je poslany vynatek kodu jen ukazkou, protoze mu chybi try..except blok pro pripadny rollback transakce.
« Poslední změna: 13-04-2019, 00:50:11 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4223
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:FreeAndNil(Query) - nezničí ho
« Odpověď #4 kdy: 13-04-2019, 09:28:09 »
Excellent
Rated 1 time
Citace
Jinak doufam, ze je poslany vynatek kodu jen ukazkou,
Samozrejme.
Ďakujem za vysvetlenie. Tak nejako som si to predstavoval. Len mi to dlho trvalo, kým som našiel chybu. Tam som ju totiž ani nehľadal :)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1759
  • Karma: 68
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:FreeAndNil(Query) - nezničí ho
« Odpověď #5 kdy: 13-04-2019, 16:32:13 »
Kdyby Te zajimaly detaily, pak ve Tvem pripade (tj. explicitnim rizeni transakci) interne nastartujes transakci pomoci isc_start_multiple, pak vytvoris objekt SQL prikazu (TFDQuery) a s nim spustis SQL prikaz cimz zavolas API funkci isc_dsql_execute2 jiz predas handle te nastartovane transakce, pripraveneho SQL prikazu a hodnoty parametru (cimz predas DBMS vse potrebne k provedeni prikazu). Pote objekty SQL prikazu uvolnis s tim, ze ta transakce zustane nastartovana a bude do jejiho ukonceni vyuzita i pro dalsi vytvarene objekty SQL prikazu (TFDQuery) jenz vyuziji stejny connection objekt pripadne jemu prirazeny transakcni objekt (kde se znovu odehraje vyse popsane).
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!