Autor Téma: Kde jsou data ?  (Přečteno 2119 krát)

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Kde jsou data ?
« Odpověď #15 kdy: 17-02-2018, 17:18:44 »
Tak jeste jinak. Pokud jsi transakci explicitne nenastartoval pomoci StartTransaction a mas zapnuty AutoCommit, pak je Ti Commit a Rollback k nicemu. Bude to FireDAC ktery bude pro kazde volani ExecSQL ridit transakce a to pro kazde volani jednu. No a v kodu ktery jsi ukazal zadne volani StartTransaction neni. Jsou jen dve moznosti. Bud transakce ridis Ty nebo FireDAC. Osobne v tomto vlakne nevidim problem a tudiz nemuzu poradit.

Pokud mas AutoCommit zapnuty a pouzijes:

Kód: Delphi [Vybrat]
  1. FDQuery1.ExecSQL('...');

Pak se FireDAC o vse postara za Tebe. Pokud mas volani vic a chces je spustit bud vsechny nebo zadny, pak pouzijes napr.:

Kód: Delphi [Vybrat]
  1. FDQuery1.Transaction.StartTransaction;
  2. try
  3.   FDQuery1.ExecSQL('...');
  4.   FDQuery1.ExecSQL('...');
  5.   FDQuery1.ExecSQL('...');
  6.   ...
  7.   FDQuery1.Transaction.Commit;
  8. except
  9.   FDQuery1.Transaction.Rollback;
  10.   raise;
  11. end;
« Poslední změna: 17-02-2018, 17:23:05 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 Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Kde jsou data ?
« Odpověď #16 kdy: 17-02-2018, 17:28:05 »
Nevznikaji, protoze FireDAC za Tebe pouzije implicitni transakci. Je to uplne to same co bys udelal explicitne v kodu.
To plati jen pro jeden izolovany ExecSQL. Ale lidi jako OP, kteri nikdy neslyseli o Commit, nenapadne, ze kdyz si pridaji jeste dalsi ExeSQL, ze kazdy pobezi v jine transakci a ze to nebude ACID.

To ano, ale v prezentovanem kodu (ktery je mazanim, nechapu proc) je jen jedno takove volani ;) A popis taky nedava smysl. Pokud OP prida vice zaznamu s autocommit ExecSQL, pak se do DBMS vlozi zadny, vsechny nebo jen nektere. Kdyz pak zaznam smaze, objevi se jeden z pridanych. To zkratka nedava smysl.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

rustymattock

  • Host
Re:Kde jsou data ?
« Odpověď #17 kdy: 17-02-2018, 17:35:29 »
No já vůbec původně s databázou nepočítal. Až při testování se usoudilo, že bude "cool", když bude data sdílet všech 9 linek.
Takže ANO, pustil jsem se do databázy, o které skoro nic nevím, představoval jsem si to jako Hurvínek válku a teď za to trpím :-(

Delfin:
Přes celou aplikaci je asi 7-8 dotazů na databázu. Jak CELECT, tak INSERT, UPDATE i DELETE. V různém pořadí, jak uživatel právě potřebuje.
Vyzkouším co jste napsali, prostuduji odkaz, který mi kolega výše zasla a budu věřit, že mě to posune.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Kde jsou data ?
« Odpověď #18 kdy: 17-02-2018, 17:42:33 »
Jen pridam, ze pokud bys chtel real time refresh, mohl by ses podivat na TFDEventAlerter.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2293
  • Karma: 123
    • Verze Delphi: D2007, XE3, DX10
Re:Kde jsou data ?
« Odpověď #19 kdy: 17-02-2018, 17:43:38 »
To ano, ale v prezentovanem kodu (ktery je mazanim, nechapu proc) je jen jedno takove volani ;)
Ve slovnim popisu ma "...Do tabulky vložím několik záznamů..." a ja hypotezu s izolovanymi transakcemi napsal jeste pred tim, nez poslal ukazku kodu

Citace
A popis taky nedava smysl. Pokud OP prida vice zaznamu s autocommit ExecSQL, pak se do DBMS vlozi zadny, vsechny nebo jen nektere. Kdyz pak zaznam smaze, objevi se jeden z pridanych. To zkratka nedava smysl.
Nicmene neviditelnost dat je typickym projevem operaci spoustenych ve vzajemne izolovanych transakci, ale pravdou je, ze pokud by pracoval v rezimu AutoCommit, tak by k tomu nemelo dojit, protoze vsechna data by mela byt commitnuta a read transakce by na ne mela videt. Ovsem vete "...Když dám pak SELECT * FROM... " rozumim tak, ze v nejakem toolu napr. v MS Management studiu zadam query a ono se to chova tak, jak je popsano.
« Poslední změna: 17-02-2018, 17:51:38 od pf1957 »

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Kde jsou data ?
« Odpověď #20 kdy: 17-02-2018, 18:05:25 »
a ja hypotezu s izolovanymi transakcemi napsal jeste pred tim, nez poslal ukazku kodu

Vim, vim. Hodnotil jsem ;) Pro me dotazy z tohoto vlakna nedavaji moc smyslu.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2084
  • Karma: 91
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Kde jsou data ?
« Odpověď #21 kdy: 20-02-2018, 08:28:25 »
..
  DataModule1.FDQuery.SQL.Clear;
  DataModule1.FDQuery.SQL.Text:='DELETE FROM box_comp WHERE A2C=:A2C AND Line=:Line AND Count=:Count AND MyStamp=:TimeStamp';
  DataModule1.FDQuery.ParamByName('A2C').AsString:=BoxComp[ARow].A2C;
  DataModule1.FDQuery.ParamByName('Line').AsString:=CompList.MyLine;
  DataModule1.FDQuery.ParamByName('Count').AsInteger:=BoxComp[ARow].Count;
  DataModule1.FDQuery.ParamByName('TimeStamp').AsFloat:=BoxComp[ARow].MyStamp;
..

Chyba moze byt v tom, ze  DataModule1.FDQuery.Params.. nemaju urceny vopred typ parametrov.
Query nie je "Prepared" a v podstate neprijma ziadne hodnoty, aj ked sa zda, ze ano..

Klikni si v "Object Inspector" na "DataModule1.FDQuery"
a tam
Params (TFDParams)
Rozbal tie 4 parametre a pridaj im hodnoty DataType resp FDDataType

To je špatná rada, jednak mění SQL, tedy FireDac automaticky vytvoří sadu parametrů a za druhé se spoléhat na nastavení parametrů z design modu je dlouhodobě cesta do záhuby. Teď jsem to řešil u jednoho velkého cizího projektu, kdy v design modu byly nastaveny parametry, které se datově shodovaly (resp. v okamžiku vzniku i názvově), ale jejich jména se časem (>10 let) rozešla se jmény v DB.

Takže v kodu pořád fungovalo ParamByName, protože to našlo parametr z design modu a typově pořád odpovídal parametru na pozici v DB, ale jakmile se něco provedlo se storedProc (resp. se zavedl validace parametrů během migrace na FireDac z in-house komponent z doby D5) tak se to hodně rozsypalo.

Vzhledem k tomu, že FireDac cachuje parametry bych se nebál vykašlat se na parametry z design modu.

P.S.: já pokud mohu, tak se komponentám v datamodulu snažím vyhnout.


Embarcadero MVP - Czech republic

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Kde jsou data ?
« Odpověď #22 kdy: 20-02-2018, 09:57:20 »
To je špatná rada, jednak mění SQL, tedy FireDac automaticky vytvoří sadu parametrů a za druhé se spoléhat na nastavení parametrů z design modu je dlouhodobě cesta do záhuby.

Ta kolekce parametru se tvori (s defaultnim nastavenim) prave pri nastaveni SQL prikazu. Ale ani tak na tom nezalezi. Ve finale se FireDAC pokusi o implicitni konverzi hodnot parametru, a pokud je mozna konverze, nastane (a je jedno zda jsou parametry vytvoreny v design time nebo real time).

Cely proces zpracovani parametru ve FireDAC muzu popsat, kdyby mel nekdo zajem (byt uz k tomu mozna nekdy doslo). Staci rict ;)
« Poslední změna: 20-02-2018, 10:01:41 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):