C# - A Merge metódus változatai

A DataSet osztály Merge metódusai 1. rész

forráskód letöltése
Adathalmazokat kezelő alkalmazásokban szinte mindig sor kerül a DataSet osztály metódusainak, property-jeinek felhasználására. Két részből álló cikksorozatunkban bemutatjuk az osztály Merge függvényének egyes változatait. A cikkekben ismertetjük a függvények paramétereit, valamint példákon keresztül a felhasználásuk módjait.
Általános jellemzők
A Merge metódusok funkciójukat tekintve alkalmasak azonos, vagy hasonló szerkezetű adathalmazok tartalmi összehangolására, tartalmuk egyesítésére. Jól használhatók arra, hogy kliens-oldalon egy adatforrásról mindig a legfrissebb másolat legyen elérhető. A Merge függvények tipikusan olyan eljárás-sorozat végén kerülnek meghívásra, amelyben a változtatások érvényesítése, hibák javítása megtörténik és a Merge függvény meghívásával a kliens-oldalon található DataSet frissíthető az adatforrás új adataival.
Az adathalmaz frissítésekor első lépésként a forrás adathalmazra, amennyiben az szintén egy DataSet objektum, meghívásra kerül annak GetChanges metódusa, mellyel keletkezik egy másolat az aktuális forrásról, tartalmazva annak minden változását az utolsó AcceptChanges metódus-meghívás óta. Ezen eredményhalmaz tehát csak a megváltozott adattáblákat, illetve rekordokat tartalmazza, melyekben változás történt. Méretét tekintve az eredményhalmazok kisebbek, mint az eredeti DataSet objektumok, így könnyebben átadhatók egy többrétegű adatbázis-kezelő alkalmazás középső komponensének. Ez a középső komponens, mely többnyire az adatbázis-logikát (business-logics) tartalmazza, a változást tükröző eredményhalmaz alapján már bedolgozhatja a változásokat eredeti adatforrásba tárolt eljárások felhasználásával. A középső réteg ezután vagy visszaküldi a frissített adathalmazt (az eredeti forrást) egy újabb lekérdezés lefuttatásával – mely halmaz már tartalmazza a változásokat és az eredeti adatokat (példaként említhető, hogy az eredeti adathalmazban automatikusan létrehozott elsődleges kulcsok érvényesülnek a kliens-oldalon is) -, vagy csak visszaküldi a változást tartalmazó adattárolót. A második megoldásban kerülhet sor arra, hogy a kliens-oldali adathalmazt a DataSet osztály Merge metódusának valamely változatával - attól függően, hogy a változásokat milyen adatszerkezet tartalmazza -, tartalomban hozzáigazítsa az eredeti, frissített adatforráshoz.
A magyarázatok megértését megkönnyítendő cél adathalmaznak (target-nek) nevezzük a Merge metódust meghívó DataSet adathalmazt, mely a fenti példánál maradva a kliens-oldali adathalmazt jelenti, és forrás adathalmaznak (source-nak) nevezzük a függvény paramétereként megkapott adathalmazt.
A Merge metódus meghívásakor a két összehangolandó adatszerkezet sémája összehasonlításra kerül, ugyanis előfordulhat, hogy ezek között különbség mutatkozik. Értem ezalatt, hogy a forrás-adathalmaz egy oszloppal gyarapodott. Ekkor a Merge metódus megfelelő változatát használva paraméterben megadható, hogy ez jelenjen-e meg a cél-adathalmazban. A Merge függvény ezen változataival a cikksorozat következő számában foglalkozunk részletesen. Mostani példánkban az összehangolandó adathalmazaink azonos sémával rendelkeznek.
A sémák összehangolása után az adatok is összehangolásra kerülnek. Hogy miként az nagyban függ attól, hogy a forrás-adathalmaz új, vagy a GetChanges metódus meghívásával keletkezett eredményhalmaz. Utóbbi esetben a függvény meghívásakor minden adatrekord kap egy egyedi azonosítót, mely a későbbi Merge procedúrában felhasználódik. Az azonosító belsőleg generált, módosítani vagy hozzáférni nem lehet. Természetesen a másolt sorok a forrásban azzal az azonosítóval rendelkeznek, mint az eredeti sorok a cél-halmazban.
A Merge procedúrája eltérő újonnan létrehozott forrás-adathalmaz és a GetChanges metódus eredményeként előállt forrás-adathalmaz esetén. Az előbbi esetben a sorok mindegyike rendelkezik egy, az adott sor állapotát tükröző jellemzővel. A jellemző értéke lekérdezhető a RowState property kiolvasásával. Az eredmény a DataRowState felsorolt típus egy eleme, mely a következő értékeket veheti fel:
  • Added : A sor a DataRowCollection gyűjteményhez adódott (mely az adattáblában tárolja a sorokat, Rows property néven érhető el), de az adathalmaz AcceptChanges függvénye még nem hívódott meg.
  • Deleted : A sor törlésre került.
  • Detached : A sor létrehozásra került, de még nem adódott hozzá a DataRowCollection gyűjteményhez.
  • Modified : A sor módosításra került, de az AcceptChanges metódus még nem hívódott meg.
  • Unchanged : A sor az utolsó AcceptChanges metódushívás óta nem változott.
A GetChanges metódushívás eredményeként előállt adathalmazban megtalálható egyedi azonosító alapján történik a keresés a cél-adathalmaz azonos soraira, és történik meg az adatok frissítése.
Fontos megemlíteni, hogy a Merge procedúra ideje alatt a megszorítások nem engedélyezettek. Ha valamely megszorítás a Merge procedúra után nem érvényesülhet (például unique megszorítás esetén van két azonos érték két rekordban), generálódik egy ConstraintException kivétel, és az adatok addig nem változnak meg. Ebben az esetben az adathalmaz EnforceConstraints property-je false értékre állítódik, a nem megfelelő rekordok pedig hibásként lesznek megjelölve. Az EnforceConstraints property true értékre állítása előtt a nem megfelelő értékeket ki kell javítani.
A DataSet Merge metódusának változatai
Ebben a szakaszban bemutatjuk a Merge metódus három változatát, melyek paraméterként csak az adatszerkezetet kapják meg.
Merge
Osztály: DataSet
public void Merge(
DataRow[] rows
)
A függvény ezen változata alkalmas arra, hogy DataRow típusú tömböt adjunk meg forrás adathalmazként, majd ezt a cél-adathalmazzal összehangoljuk. Viszonylag ritkán használt, mivel a tömb felhasználható metódusai korántsem olyan hatékonyak, mint a DataTable, illetve DataSet osztály függvényei.
Paraméterek
DataRow[] rows
Tetszőleges adatsorokat tartalmazó tömb, mely sorainak természetesen hasonló szerkezettel kell rendelkezniük, mint a cél-adathalmaz.
Merge
Osztály: DataSet
public void Merge(
DataSet dataset
)
A metódussal lehetőségünk van egy DataSet típusú objektumot hozzáadni a cél DataSet halmazhoz. A metódus működési elvét a mellékelt példa ismertetésekor taglaljuk.
Paraméterek
DataSet dataset
A forrás-adathalmazt reprezentáló DataSet objektum, melynek sémája és adatai összefűzésre kerülnek.
Merge
Osztály: DataSet
public void Merge(
DataTable datatable
)
A metódussal lehetőségünk van egy DataTable típusú objektumot hozzáadni a cél DataSet halmazhoz. A metódus működési elvét a mellékelt példa ismertetésekor taglaljuk.
Paraméterek
DataTable datatable
A forrás-adathalmazt reprezentáló DataTable objektum, melynek sémája és adatai összefűzésre kerülnek.
Merge
Osztály: DataSet
public void Merge(
DataSet dataSet,
bool preserveChanges
)
Az eddigiekben említett Merge függvényekhez képest egy paraméterrel kiegészül, így finomítható a Merge procedúra.
Paraméterek
DataSet dataSet
A forrás-adathalmazt reprezentáló DataSet objektum, melynek sémája és adatai összefűzésre kerülnek.
bool preserveChanges
A paraméter megadásával utasíthatjuk a függvényt arra, hogy miként adja a sorok celláiban bekövetkezett változásokat a cél-adathalmazhoz. TRUE értéket adva a paraméternek az adott cella megváltozott értéke nem érvényesül a cél-cellában (vagyis megvédi a tartalmát), FALSE esetén érvényesül.
A fent említett ConstraintException kivétel mellett az utolsó két metódus esetén érdemes megemlíteni, hogy a paraméterként átadott adatobjektumok null értéke esetén egy ArgumentNullException kivétel keletkezik.
Gyakorlati felhasználás
A mellékelt Windows-os alkalmazásban bemutatásra kerülnek a Merge metódus azon változatai, melyek paraméterként egy DataTable, vagy egy DataSet objektumot kapnak. A Form-on található két DataGrid kontrol, melyekben látható lesz a Merge procedúrák eredménye. A felső rácsban jelennek meg a forrás-adathalmazok felváltva, a lenti rácsban pedig a cél-adathalmazok. Minden Merge procedúra egy forrás-cél párral kerül meghívásra, a két Merge változat eredményei nem keverednek össze. A Form egy felirata jelzi, hogy az adott pillanatban éppen melyik eljárás folyik.
A DataSet.Merge(DataTable) metódussal való munkához be kell nyomni a „Table” feliratú nyomógombot, amivel elérhetjük, hogy a rácsokban a dtSource-dsTarget1 adathalmaz-páros jelenjen meg, minden módosítás ezekre vonatkozzon, a Merge művelet csak ezeket érinti.
A DataSet.Merge(DataSet) metódus kipróbálásához nyomjuk be a „DataSet” feliratú nyomógombot, így aktiválhatjuk a dsSource-dsTarget2 adathalmaz-páros megjelenítését és elindíthatjuk a velük való munkát.
A Merge metódus meghívására a „Merge ” feliratú gombra kattintva késztethető az alkalmazás. A forrás adathalmazok minden esetben módosíthatók, mintha csak valódi adatforrások kivonatai lennének, míg a cél-adathalmazok nem módosíthatóak, modellezve a kliens-oldali adatokat, melyeknél az aktualitás a lényeges szempont.
A forrás- és cél-adathalmazok kezdetben azonos adatokkal rendelkeznek, feltöltésükről három függvény gondoskodik a Form konstruktorában.
A függvények működéséről elmondható, hogy forrás-rekord törlésekor a sorok RowState property-je Deleted értékű lesz a cél-halmazban, majd törlődik a DataRowCollection-ból, míg sorok beszúrásánál a property Added értéke mellett beszúródik az adott rekord. A forrásadatok létrehozásakor a táblák első oszlopán létrehoztunk egy UNIQUE megszorítást, mellyel lehetővé válik, hogy az adatok összehangolásánál a cél-halmaz ne tartalmazzon többször egy adott forrás-rekordot.
DataColumn[] t2KeyCol = new DataColumn[1];
t2KeyCol[0] = dc1;
dtSource.PrimaryKey = t2KeyCol;
A függvény viselkedését tekintve érdekes, mivel a forrás-adathalmazban hiába végzünk el egy rekordtörlést, a törölt rekord nem kapja meg a Deleted állapotjelzőt, ha azelőtt a halmaz egészében nem volt valamilyen módosítás, következésképpen nem törlődik a cél-adathalmaz DataRowCollection rekordgyűjteményből.
Az alkalmazás Form-ján elhelyezett jelölőnégyzet akkor használható, amikor DataSet objektumot összefűzünk a második adathalmazunkhoz. A négyzetet bejelölve egy adott cella értékének változása nem jelenik meg a cél-cellában. Eltávolítva a jelölést, a régi adatok frissülnek.

A DataSet osztály Merge metódusai cikksorozat

A Merge metódus változatai - A DataSet osztály Merge metódusai 1. rész

A Merge metódus változatai - A DataSet osztály Merge metódusai 2. rész