Z toho je zřejmé, že INSERT INTO proběhl úspěšně. Ale kde ty data jsou, než se jim uráčí ukázat se v databáze ??Ta data jsou pravdepodobne v DB a viditelna budou, az se tvoje aplikace uraci commitnout transakci. S DB se zpravidla pracuje pod nejakou transakci, nejbezneji typu ReadCommitted (na ruznych RDBMS se to muze jmenovat ruzne), jejiz zakladni vlastnosti je, ze na data vlozena v ramci teto transakce je videt jen z teto transakce a vsichni ostatni ta data vidi az po commitnuti transakce. To dava sanci napr. strhnout penize z jednoho uctu a pripsat je na ucet jiny. Ostatni vidi stav pred prevodem a po prevodu, nic mezi tim, stejne jako to dava sanci stornovat vsechny DB operace od zahajen v pripade, ze neco selze. Rika se tomu atomicita. Schematicky se s DB pracuje takto:
Pravděpodobnější samozřejmě nejspíš bude, že chyba je na straně kódu aplikace,
Transaction.Start;
try
// Vsechny tvoje logicky spojene (atomicke) DB operace
delete ...
insert ....
insert ....
select ...
insert ...
...
Transaction.Commit;
except
Transaction.Rollback;
raise;
end
..
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;
..
O Commit slyším poprvé. Takže to bude asi ono. Dle Googlu předpokládám, že za DataModule1.FDQuery.ExecSQL, doplním DataModule1.FDConnection.Commit. Ano?Pozri si nastavenia Connection a Transaction. Určite máš niekde nastavený Autocommit := True; Pre operácie, ktoré menia údaje sa zásadne nastavuje na False. Prejdi si diskusiu FireBird. Tam mi to vysvetľovali.
Stejně nerozumím proč to v 95% jede bez problémů, jestli tam něco chybí.
Chyba moze byt v tom, ze DataModule1.FDQuery.Params.. nemaju urceny vopred typ parametrov.To som ešte v živote nenastavoval a všetko mi beží :)
Chyba moze byt v tom, ze DataModule1.FDQuery.Params.. nemaju urceny vopred typ parametrov.
Pozri si nastavenia Connection a Transaction. Určite máš niekde nastavený Autocommit := True; Pre operácie, ktoré menia údaje sa zásadne nastavuje na False.
Pokud spoustis jeden prikaz jako je i tento priklad, neni duvod autocommit nepouzit.Je, protoze pak vznikaji paskvily, ktere v 95 % funguji, jak pise OP. Osobne bych rezim AutoCommit zcela zrusil: slusne napsany soft bude pouzivat vsude jeden zpusob rizeni transakce a protoze AutoCommit je pro ten ucel k nicemu, je jasne, jak to delat ;-)
A FireDAC je inteligentni natolik, ze pokud explicitne nastartujes transakci, implicitni nevytvori (takze tim zavolanim StartTransactionVetsina DB connectivit pri explicitnim nastartovani transakce lokalne shodi AutoCommit, ale je lepsi pri kazdem vytvoreni instance transakce ho explicitne priradit na False (treba pomoci interposed tridy, ktera to v konstruktoru shodi jednou pro celou aplikaci), protoze tim davam jasne najevo vsem ctenarum kodu, ze vim co delam a transakce si budu vsude ridit sam.
P.S. chybi Ti tam Rollback.Nejen, Ma-li byt rizeni transakce ciste, musi byt StartTransaction pred try, protoze kdyz se nepovede zahajit transakci, tak to nesmi spadnout na Rollback, ale tu chybu je treba odchytit v jinem (vnejsim) scope try-except.
[quote link=topic=16039.msg99015#msg99015 date=1518881065]Je, protoze pak vznikaji paskvily, ktere v 95 % funguji, jak pise OP.
Pokud spoustis jeden prikaz jako je i tento priklad, neni duvod autocommit nepouzit.
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.
P.S: k čemu je Rollback(když už čtu, že tam musí být) ?Google negoogluje? Heslovite treba http://nb.vse.cz/~palovska/bivs/DBII_2_advancedSQL.pdf (http://nb.vse.cz/~palovska/bivs/DBII_2_advancedSQL.pdf)
Snad to opravdu bylo ono.Tezko rict, ale obecne plati, ze s transakcemi a thready je treba pracovat cistym zpusobem, protoze jinak mohou vznikat tezko laditelne/simulovatelne/lokalizovatelne chyby a je treba udelat maximum pro to, aby tato kategorie chyb pokud mozno vubec nevznikla. Samozrejme to zacina u teorie...
[quote link=topic=16039.msg99018#msg99018 date=1518882452]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.
Nevznikaji, protoze FireDAC za Tebe pouzije implicitni transakci. Je to uplne to same co bys udelal explicitne v kodu.
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
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.
a ja hypotezu s izolovanymi transakcemi napsal jeste pred tim, nez poslal ukazku kodu
..
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.