C# - PRIMARY KEY megszorítás létrehozása

Megszorítások DataTable-objektumban 2. rész

forráskód letöltése
Cikksorozatunk előző számában megismerkedhettünk azzal az eljárással, melynek segítségével UNIQUE megszorítás hozható létre adott DataTable objektum oszlopaira. Mai cikkünkben megismerhetjük, hogy milyen osztály lesz segítségünkre abban, hogy idegen kulcs megszorítást deklaráljunk egy tábla olyan oszlopaira, melyek egy másik táblában is megtalálhatóak. Bemutatjuk az osztály property-jeit, melyekkel finomítható az egyes rekordok törlési mechanizmusa.
Ahogy az ezt megelőző cikkünkből kiderült, az adattáblák oszlopaira létrehozott megszorításokat (objektumokat) az adott tábla Constraints kollekciójába kell felvennünk ahhoz, hogy ezek a megszorítások érvényre jussanak.
Idegen kulcs megszorítást a ForeignKeyConstraint osztály példányosításával hozhatunk létre, melyet szintén fel kell vennünk az adott tábla megszorítás gyűjteményébe. Az osztály property-jeit feltöltve jelölhetjük ki a megszorításban érintett oszlopokat, valamint adhatjuk meg az egyes rekordok törlésére, illetve frissítésére vonatkozó információkat. Lássunk most ezen property-ket:
AcceptRejectRule
Osztály: ForeignKeyConstraint
public virtual AcceptRejectRule AcceptRejectRule {get; set;}
Lehetséges értékei az AcceptRejectRule enumerátor valamely eleme, melyekkel beállítható, hogy milyen akció történjen akkor, amikor a táblára meghívódik az AcceptChanges, vagy a RejectChanges metódusok valamelyike. Értékei:
Érték Magyarázat
Cascade A főtábla oszlopának értékeiben bekövetkezett valamennyi változás érvényesül a gyermektábla oszlopának értékein (idegen kulcs oszlopok).
None Nem történik semmilyen változás.
Columns
Osztály: ForeignKeyConstraint
public virtual DataColumn[] Columns {get;}
Lekérdezhetők azok a gyermektábla oszlopok, mely valamely főtáblabeli oszlophoz tartoznak, vagyis idegen kulcs oszlopok.
ConstraintName
Osztály: ForeignKeyConstraint
public virtual string ConstraintName {get; set;}
Megadhatunk egy nevet a megszorítás számára, mellyel a DataTable objektum Constraints gyűjteményében hivatkozhatunk az adott megszorításra.
DeleteRule
Osztály: ForeignKeyConstraint
public virtual Rule DeleteRule {get; set;}
Megadható egy szabály annak meghatározására, hogy mi történjen abban az esetben, mikor egy rekordot törlünk a főtáblából, mely bizonyos oszlopaival kötődik a gyermektáblához. Lehetséges értékei a Rule enumerátor elemei:
Érték Magyarázat
Cascade A gyermektábla oszlopaira hivatkozó oszlopot tartalmazó rekord törlése a főtáblából az érintett összes rekord törlését eredményezi a gyermektáblában. Az adott property-nek ez az alapértelmezett beállítása.
SetNull A gyermektábla érintett oszlopának valamennyi hivatkozott értékét egy DBNull értékkel helyettesíti. Ez általában a ’(null)’ bejegyzés, de ennek megjelenése függ attól, hogy az adott oszlopra deklaráltunk-e UNIQUE megszorítást, mert ebben az esetben a DBNull értékek sem ismétlődhetnek.
SetDefault Ebben az esetben az adott oszlop érintett rekordértékeit az adott oszlopra megadott DefaultValue (alapértelmezett érték) értékkel helyettesíti.
None Nem történik semmilyen változás a gyermektáblában. Ebben az esetben egy InvalidConstraintException kivétel dobódik, amikor megpróbálunk rekordot törölni a főtáblából.
RelatedColumns
Osztály: ForeignKeyConstraint
public virtual DataColumn[] RelatedColumns {get;}
Lekérdezhetők azok az oszlopok, melyek a főtáblában találhatóak, és érintettek a megszorításban.
RelatedTable
Osztály: ForeignKeyConstraint
public virtual DataTable RelatedTable {get;}
Lekérdezhető a szülőtábla, melynek oszlopai megtalálhatóak a gyermektáblában.
Table
Osztály: ForeignKeyConstraint
public override DataTable Table {get;}
Megadja az adott megszorítás gyermektábláját.
UpdateRule
Osztály: ForeignKeyConstraint
public virtual Rule UpdateRule {get; set;}
Megadható egy szabály annak meghatározására, hogy mi történjen abban az esetben, mikor egy rekord érintett oszlopának értékét megváltoztatjuk a főtáblában, mely oszlop megtalálható a gyermektáblában. Lehetséges értékei szintén a Rule felsorolt típus elemei, csakúgy mint a DeleteRule property esetében.
Az osztály konstruktorainak néhány változata közül a következő rendelkezik a leghosszabb paraméterlistával, így itt adhatjuk meg a legtöbb információt:
ForeignKeyConstraint
Osztály: ForeignKeyConstraint
public ForeignKeyConstraint(
string constraintName,
string parentTableName,
string[] parentColumnNames,
string[] childColumnNames,
AcceptRejectRule acceptRejectRule,
Rule deleteRule,
Rule updateRule
);
Létrehoz egy megszorítás osztály példányt.
Paraméterek
string constraintName
Megszorítás neve.
string parentTableName
Főtábla neve.
string[] parentColumnNames
Főtábla oszlopai.
string[] childColumnNames
Gyermektábla oszlopai.
AcceptRejectRule acceptRejectRule
Alkalmazott szabály AcceptChanges, illetve RejectChanges metódusok hívása esetén.
Rule deleteRule
Alkalmazott szabály rekordok törlésekor.
Rule updateRule
Alkalmazott szabály rekordok oszlopértékeinek frissítésekor.
A mellékelt példában programból feltöltünk két adattáblát, a gyermektáblában deklarálunk egy idegen kulcs megszorítást, és modellezzük, mi történik akkor, amikor a ComboBox kontrolban megadott azonosítóval rendelkező rekordon a kiválasztott szabály alapján elvégezzük a törlési műveletet. A tábla objektumokat elhelyezzük egy DataSet objektumban.
A felső (Products) tábla PRODUCT_ID oszlopa megtalálható az alsó (Orders) táblában idegen kulcsként, melynek megadásáról a következőképpen gondoskodunk a feltöltéskor:
ForeignKeyConstraint fkc = new ForeignKeyConstraint("fk",ds.Tables[0].Columns[0],ds.Tables[1].Columns[1]);
És a megszorítás objektumot betesszük a táblaobjektum gyűjteményébe:
ds.Tables[1].Constraints.Add(fkc);
A megadott azonosítóval rendelkező rekord törlésekor megvizsgáljuk, hogy mely értéket adtuk meg a ComboBox kontrolban, majd ennek megfelelően állítjuk be a DeleteRule property-t:
((ForeignKeyConstraint)ds.Tables[1].Constraints[0]).DeleteRule = Rule.Cascade;
...
((ForeignKeyConstraint)ds.Tables[1].Constraints[0]).DeleteRule = Rule.SetNull;
...
((ForeignKeyConstraint)ds.Tables[1].Constraints[0]).DeleteRule = Rule.None;
A SetDefault értéket nem teszteljük, mert nem adtunk meg alapértelmezett értéket a PRODUCT_ID oszlopra. A beállítás után elvégezzük a törlést:
ds.Tables[0].Rows.RemoveAt(idCombo.SelectedIndex);
A Rule.SetNull értéket megadva, pedig elkapjuk az InvalidConstraintException kivételt. A táblák teljes tartalmának törlésekor a helyreállítás a megjelenő gombbal megtehető.

Megszorítások DataTable-objektumban cikksorozat

UNIQUE-megszorítás létrehozása - Megszorítások DataTable-objektumban 1. rész

PRIMARY KEY megszorítás létrehozása - Megszorítások DataTable-objektumban 2. rész