Databáze > Ostatní DB

SQLite Update nefunguje

(1/8) > >>

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