Databáze > MS SQL

Kde jsou data ?

(1/5) > >>

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