Databáze > Ostatní DB
SQLite Update nefunguje
miroB:
Nejde mi Update. Presnejšie jeho výsledky sa nijako neprejavia.
Ido o dva SQL príkazy. Jedno Select, druhé Update. To prvé riadi napĺňanie druhého.
Select je JOIN dvoch tabuliek. Za zmienku stojí, že Update sa týka jednej z tabuliek použitých v Select.
Asi bude problém s nejakým Lock.. Zrejme parametre conn, alebo query.. Všetko sa zdá na prvý pohľad v poriadku. Debugovanie ukazuje správne naplnené hodnoty parametrov pre update.
Nehlási sa žiadna chyba. V ramci Try ani neprebehne cez oblasť EXCEPT.. takže bez chyby.. Lenže hodnoty v tabuľke sa nezmenia!!! Princíp :
--- Kód: Delphi ---try conn.StartTransaction; .. // Update kód ja nižšie conn.commitexcept conn.rollback endViac info:
--- Kód: Delphi --- qU := TFDQuery.Create( self ); qU.Connection := conn; qS := TFDQuery.Create( self ); qS.Connection := conn; qU.SQL.Text := 'UPDATE Csv SET Flag=? WHERE rowid= ?' ); qU.Params.BindMode := pbByNumber;.. qu.Params.ArraySize := kMaxArrSize; // 10 000 qS.SQL.Text := sSQL; // Transactions and DML Commands, odkaz dolu qS.Active := TRUE; qS.DisableControls; j := 0; qs.First; while not qs.eof do begin for i := 0 to qS.FieldCount - 1 do begin if qs.fields[ i ].IsNull then qU.Params[ i ].Clear( j ) else qU.Params[ i ].Values[ j ] := qs.fields[ i ].Value; end; qs.Next; Inc( j ); if j = kMaxArrSize then begin conn.StartTransaction; try qu.Execute( j ); // 10 000 update naraz j := 0; conn.Commit; except conn.Rollback; end; end; end; qs.EnableControls;..http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_SQLite_with_FireDAC#SQLite_Transactions.2C_Locking.2C_Threads_and_Cursors
Neviete poradiť prečo, sa hodnoty neprejavia? Aj napriek tomu, že všetko prebehne presne tak, ako by malo ? Bez chyby, len tie data nereagujú..
Select:
--- Kód: MySQL ---SELECT d.[Flag] | 16, d.rowid FROM Csv AS d INNER JOIN KonZast k ON d.[CISLO ZASTAVKY]=k.[CISLO ZASTAVKY] ORDER BY D.ROWID
Stanislav Hruška:
Ja tam vidím 2 x conn.StartTransaction; To je chyba! To máš dve samostatné transakcie.
--- Kód: Delphi ---if j = kMaxArrSize then begin conn.StartTransaction; try qu.Execute( j ); // 10 000 update naraz j := 0; conn.Commit; except conn.Rollback; end;end; Toto mi hlava neberie. Čo sa stane, vzhľadom na prvú ukážku kódu, ak budeš mať viac ako 10 000 požiadaviek? Urob si pre update samostatnú transakciu a obsluhuj ju len v kóde hore.
miroB:
--- Citace: Stanislav Hruška 18-03-2018, 10:11:36 ---Ja tam vidím 2 x conn.StartTransaction; To je chyba! To máš dve samostatné transakcie.
--- Konce citace ---
Mozno je na tom nieco, ale neslo to, ani ked to bolo cele zabalene do jednej transakcie, vratane vodiaceho select query (qS). Chyba bude zrejme v nastaveniach Conn a qS, ci qU. Ale tych nastaveni je milion .., tak neviem identifikovat tie spravne.
Mnohe veci v podobnom kontexte idu.
--- Citace: Stanislav Hruška 18-03-2018, 10:11:36 ---Toto mi hlava neberie. Čo sa stane, vzhľadom na prvú ukážku kódu, ak budeš mať viac ako 10 000 požiadaviek? Urob si pre update samostatnú transakciu a obsluhuj ju len v kóde hore.
--- Konce citace ---
To je Array DML. Vid odkaz:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_SQLite_with_FireDAC#SQLite_Transactions.2C_Locking.2C_Threads_and_Cursors
Cyklus okolo j je dobre. Je to zabalene v not qs.EOF .. qs.next. J-cko sa vzdy po 10 000-coch resetuje na 0. V ramci vodiaceho qS, prebehne cca 3 miliony x Update. Teda v davkach po 10 000. Oproti jednotlivym zapisom je to vyznamne zrychlenie. Bez array DML je to zufalo pomale, pre dane potreby.
Ale je fakt, ze som to skusal aj bez Array DML ale Update sa tiez nijako neprejavil. Prosim, ak mate niekto info k potrebnym nastaveniam conn, qS, qU, ci lock, ci wait, alebo .., pre dany pripad, budem vdacny za radu.
99402:
--- Citace: Miroslav Baláž 18-03-2018, 10:36:50 ---Oproti jednotlivym zapisom je to vyznamne zrychlenie. Array DML
--- Konce citace ---
Array DML je v tomto pripade jen emulovan. A obecne ma vyznam pro prenos dat do RDBMD po siti. SQLite podporuje jen INSERT vicenasobnych hodnot. Takze ve Tvem pripade dojde stejne interne jen k opakovanemu spousteni dotazu.
Co vsak myslis tim projevem hodnot? Letmo vsak (cimz netvrdim ze je to duvod pro chybejici commit zmen), tu transakci bys mel ovladat pro celou davku, ne pro kazdy spousteny Execute (abys zachoval konzistenci dat).
Stanislav Hruška:
Zopakujem: vytvor si samostatné TRANSACTION pre qS a qU. Pre qS Autocommit True, pre qU False. Teraz sa Ti bijú. Array DML používam a nemám problém.
--- Kód: Delphi --- conFOC := TFDConnection.Create(Self); conFOC.Connected := False; conFOC.DriverName := 'FB'; conFOC.Params.DriverID := 'FB'; trnTblRead := TFDTransaction.Create(Self); trnTblRead.Connection := conFOC; trnTblRead.Options.Isolation := xiReadCommitted; trnTblRead.Options.AutoStart := True; trnTblRead.Options.AutoCommit := True; trnTblRead.Options.ReadOnly := True; trnTblRead.Options.DisconnectAction := xdRollback; trnQrySelect := TFDTransaction.Create(Self); trnQrySelect.Connection := conFOC; trnQrySelect.Options.Isolation := xiReadCommitted; trnQrySelect.Options.AutoStart := True; trnQrySelect.Options.AutoCommit := True; trnQrySelect.Options.ReadOnly := True; trnQrySelect.Options.DisconnectAction := xdRollback; trnUpd := TFDTransaction.Create(Self); trnUpd.Connection := conFOC; trnUpd.Options.Isolation := xiReadCommitted; trnUpd.Options.AutoStart := False; trnUpd.Options.AutoCommit := False; trnUpd.Options.ReadOnly := False; trnUpd.Options.DisconnectAction := xdRollback;
Navigace
[0] Seznam témat
[#] Další strana
Přejít na plnou verzi