Moștenitor de la tibupdatesql cu o tranzacție scrisă

Moștenitor de la TIBUpdateSQL cu o tranzacție de scriere

Iată o încercare de a introduce principiul separării tranzacțiilor în "citire" și "scriere" pentru componentele IBCustomDataset din IBX. Utilizarea IBUpdateSQL ca și componentă de bază este explicată de dorința de a minimiza activitatea de schimbare a codului sursă și de capacitatea sa de reparații IBDataset poate provoca probleme probabile la utilizarea noilor versiuni ale IBX.

Pentru a înțelege mecanismul IBUpdateSQL, trebuie să evidențiați următoarele proprietăți și metode: private
FQueries: matrice [TUpdateKind] din TIBQuery;
public
proprietate interogare [UpdateKind: TUpdateKind]: TIBQuery citiți GetQuery; Proprietatea array FQueries stochează indicii către obiecte de tip TIBQuery ale căror valori sunt inițial zero. Când suni pentru prima dată interogare, se numește metoda GetQuery - creează un obiect și inițiază proprietățile IBDatabase și IBTransaction. Observ că este probabil că unul sau mai multe obiecte TIBQuery nu vor fi create, pur și simplu, adică Nu a existat nicio modificare a datelor și FDataset nu a accesat metoda UpdateObject.Apply. Pur și simplu, componenta IBUpdateSQL face o lucrare "manuală" ca var
MySql: TIBSQL;

MySql: = TIBSQL.Creați (zero);
MySql.database: = dm.Base;
MySql.Transaction: = dm.trCitiți;
MySql.SQL: = 'la-la-la';

finalizare
dacă este atribuită (MySql) atunci
MySql.Free; Toate acestea sunt implementate în metoda GetQuery.

Pentru a rezolva sarcina de "implementare" a unei tranzacții, trebuie să scrieți codul:
  1. manipularea evenimentului SetUpdateTransaction
  2. efectuați modificări la GetQuery
  3. gestionați evenimentul de notificare
  4. bypass privacy și static
Dacă primele trei puncte sunt mai mult sau mai puțin clare, atunci ultimul punct necesită înlocuirea FQueries și a unor metode. Mai jos este o soluție care a fost folosită de mine de mai mulți ani în diferite variante.