HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Adattáblák közötti kapcsolat megvalósítása


Példaprogram letöltése

80476 bájt

Adatbázisokkal végzett munkában szükség lehet arra, hogy olyan bonyolult lekérdezéseket hajtsunk végre, melyek az adatbázis több, esetenként 4-5 tábláját érintik. Ugyanakkor a bonyolult SQL-parancsok átláthatatlanok, ráadásul az állandó adatbázis-műveletek lelassítják programjainkat. A .NET Framework DataSet objektuma lehetővé teszi, hogy a szükséges adattáblák tartalmát a memóriában tartsuk, valamint a táblák közötti függőségi viszonyokat is eltároljuk. Ennek módját mutatjuk be cikkünkben.

A mellékelt példában a Northwind adatbázis négy tábláját használjuk fel, melyek adatállományai négy darab XML állományban vannak eltárolva a program mappájában. A program futásakor ezeket beolvassuk egy DataSet-be.
A Form-ra helyezett ComboBox-ban találjuk meg a Customers tábla minden olyan elemét, melyhez valamilyen rendelés tartozik az Orders táblában. Egy vevőt kiválasztva elérhetjük, hogy az összes rendeléséhez tartozó adat egy része megjelenjen a ListBox kontrolban úgy, hogy az adatokat a másik két táblából gyűjtjük össze.
Ezt minden alkalommal, amikor egy új vevőt választunk egy SQL-utasítással végezhetnénk el, ha a rendelés száma és dátuma, valamint a rajta szereplő termék neve és mennyisége érdekelne minket. Az SQL-utasítás a következő lehetne:
SELECT c.CustomerId, o.OrderId, o.OrderDate,
p.ProductName, od.Quantity 
FROM Customers c, Orders o, Products p, [Order Details] od
WHERE c.CustomerId = o.CustomerId AND o.OrderId = od.OrderId AND od.OroductId = p.ProductId
Egyszerűbb azonban ha minden táblát betöltünk egy DataSet objektumba, és a köztük felépülő kapcsolatot egy DataRelation objektumban tároljuk. Ekkor elérhetjük, hogy a kulcsokon keresztül egymástól függő táblák ismerjék egymáshoz fűződő viszonyukat, így a keresés és lekérdezés egyszerűbbé válik.
A DataRelation objektumoknak a konstruktora kulcsfontosságú, mivel itt adjuk meg a kapcsolat alapjait jelentő oszlopokat.
DataRelation
Osztály: DataRelation
public DataRelation(
string relationName,
DataColumn parentColumn,
DataColumn childColumn
);
A táblák közötti összerendezés megvalósítása történik itt.
Paraméterek
string relationName
Kapcsolat neve.
DataColumn parentColumn
Szülőtábla kulcsoszlopa.
DataColumn childColumn
Gyermektábla idegenkulcs oszlopa.
Az adatok ilyen formátumú összerendezése biztosítja az integritást, és egyszerűsíti a kereséseket.
A program betöltődésekor megvalósítjuk az összerendezéseket, vagyis példányosítjuk a DataRelation osztályt. Elsőkét a Customers és az Orders táblákat.
co = new DataRelation("CustomerOrders",ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
Majd az Orders és az OrderDetails táblákat.
ood = new DataRelation("OrderOrderDetails",ds.Tables["Orders"].Columns["OrderID"],ds.Tables["OrderDetails"].Columns["OrderID"], false);
Végül a Products és az Orders táblákat.
op = new DataRelation("OrderProducts",ds.Tables["Products"].Columns["ProductID"],ds.Tables["OrderDetails"].Columns["ProductID"]);
A műveletek végén a DataSet objektum Relations kollekciójában meg kell adni a fent létrehozott objektumokat.
ds.Relations.Add(co);
ds.Relations.Add(ood);
ds.Relations.Add(op);
Amennyiben választunk egy vevőt, a következő művelet hajtódik végre az adott vevő rendelésadatainak megjelenítéséhez:
Először a Customers tábla rekordjait vizsgáljuk meg, hogy az első oszlopának értéke mely esetekben azonos a ComboBox kontrolban kiválasztott vevőkóddal.
foreach (DataRow custdr in ds.Tables["Customers"].Rows)
{
  if (custdr[0].ToString() == comboBox1.Text.ToString())
  {
Amennyiben talált a kódhoz megfelelőt, akkor indulhat a rendelésadatok gyűjtése a létrehozott adatkapcsolat felhasználásával. Amennyiben a kiválasztott elemhez tartozó rekordokat talál a kód a listában, akkor a rendelések két adata kigyűjtésre kerül.
    foreach (DataRow orderdr in custdr.GetChildRows(co))
    {
      listBox1.Items.Add("\tRendelés azonosító: " + orderdr["OrderID"]);
      listBox1.Items.Add("\tRendelés dátuma: " + orderdr["OrderDate"].ToString().Substring(0,10));
A következő lépés a rendelés részleteinek vizsgálata a másik két adat összerendelés felhasználásával.
      foreach (DataRow detaildr in orderdr.GetChildRows(ood))
      {
        listBox1.Items.Add("\t\tTerméknév: " + detaildr.GetParentRow(op)["ProductName"]);
        listBox1.Items.Add("\t\tMennyiség: " + detaildr["Quantity"]);
      }
    }
  }
Belátható, hogy elegendő a szükséges kulcs-idegenkulcs kapcsolatokkal tisztában lennünk, az adatok ilyetén összekapcsolása leveszi a vállunkról a bonyolult utasítások megfogalmazásának terhét. Az objektum képes a megszorítások nyilvántartására is, melynek elsősorban az adatintegritás szempontjából van jelentősége.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 320. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |