Databáze > MS SQL
Kde jsou data ?
rustymattock:
zdravím.
popsaný problém se objeví jen sporadicky a nemám na něj ani nepravděpodobnou hypotézu. Snad někdo, kdo s MSSQL pracuje často...
Do tabulky vložím několik záznamů (každý rádově desítky bajtů).
Když dám pak SELECT * FROM , tak ke stávajícím řádkům je přidán pouze první z přidaných záznamů (i když dám SELECT třeba 5x po sobě).
Když ten první z přidaných záznamů smažu, tak se v databázi objeví druhý přidaný... atd.
Takhle jsem si s tim hrál snad 20 minut v kuse a ze všech přidaných záznamů byl v databáze vždy jen 1 (záznamy z předešlých hodin a dnů ovšem vždy všechny).
...když jsem na to kouknul na druhý den, už v databáze byly všechny data, které jsem při testování přidával a aplikace pracovala s databází tak jak má.
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 ??
Pravděpodobnější samozřejmě nejspíš bude, že chyba je na straně kódu aplikace, ale opravdu se nechytám, co takové chování může způsobit, tudiž ani co mám hledat.
Poznámka: tabulka se testuje, takže má v tuto chvíli směšných 40-50 řádků (celkově ne víc, než 2-3 Kb). Přistupuje se k ní ze 3 PC, stejnou aplikací a nikdy ne najednou.
Stanislav Hruška:
Len tak naslepo:
* SQL.Transaction.Commit - veľmi by som sa čudoval, keby si to nemal
* MS SQL vôbec nepoznám. Nechýba Ti tam niekde niečo ako MyTable.Refresh?Aby si dostal odpoveď, tak doplň základné údaje:
* ktoré komponenty používaš na prácu s DB
* základné nastavenia Connection. Asi tam existuje niečo ako urob to všetko okamžite/až sa ti uráči, nech zmeny vidia okamžite všetci a pod.
* nejakú kompletnú jednoduchú ukážku kódu vkladania záznamov
pf1957:
--- Citace: rustymattock 17-02-2018, 02:34:12 ---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 ??
Pravděpodobnější samozřejmě nejspíš bude, že chyba je na straně kódu aplikace,
--- Konce citace ---
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:
--- Kód: ---Transaction.Start;
try
// Vsechny tvoje logicky spojene (atomicke) DB operace
delete ...
insert ....
insert ....
select ...
insert ...
...
Transaction.Commit;
except
Transaction.Rollback;
raise;
end
--- Konec kódu ---
rustymattock:
Pro doplnění: používám FireDAC
a SQL dotazy jsou zapsány takhle (obdobně pro všechny operace):
procedure DeleteFromBox_comp(ARow:integer);
begin
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;
try
DataModule1.FDQuery.ExecSQL;
except
CompList.MyErrorMessage:='Odebrání materiálu ('+BoxComp[ARow].A2C+') z databáze se nezdařil(box_comp)';
exit;
end;
end;
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 ?
Stejně nerozumím proč to v 95% jede bez problémů, jestli tam něco chybí.
miroB:
--- Citace: rustymattock 17-02-2018, 15:26:38 ---..
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;
..
--- Konce citace ---
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
Potom skus znovu a dufam ti to cele uz pojde.
Vid aj obrazok
Navigace
[0] Seznam témat
[#] Další strana
Přejít na plnou verzi