C# - Reláció létrehozása két adattábla között

forráskód letöltése
Ha van két olyan táblánk, melyeknél van egy közös azonosító, akkor e két táblát össze tudjuk kötni master-detail kapcsolatba. Ez esetben akár arra is van lehetőségünk, hogy az így összekapcsolt két táblát egyetlen DataGrid-ben jelenítsük meg.
Első lépésként létrehozunk egy kapcsolatot az MS SQL szerver Northwind példaadatbázisával, melyhez az SQLConnection osztályt használjuk. Ehhez a mellékelt programban meg kell adnunk a szervergép nevét, bejelentkezési nevünket és jelszavunkat.
    private void button1_Click(object sender, System.EventArgs e)
    {
      SqlConnection connection = new SqlConnection("Data Source="+textBox1.Text+";uid="+textBox2.Text+";password="+textBox3.Text+";initial catalog=Northwind;Connect Timeout=3");
      connection.Open();
Ha a kapcsolat létrejött, létrehozunk egy DataSet objektumot, melyben a két tábla adatait tároljuk.
           DataSet ds = new DataSet();
Egy SqlDataAdapter osztály segítségével futtatunk egy lekérdezést az Orders táblára.
A kapott eredményt Orders névvel eltároljuk a már létrehozott DataSet objektumába.
      SqlDataAdapter da1 = new SqlDataAdapter("select * from Orders", connection);
      da1.Fill(ds, "Orders");
Egy újabb SqlDataAdapter osztállyal futtatunk egy másik lekérdezést, most már az Order Details táblára.
Ennek eredménye ismét a DataSet osztály változójába kerül.
      SqlDataAdapter da2 = new SqlDataAdapter("select * from \"Order Details\"", connection);
      da2.Fill(ds, "Order Details");
Ezek után jöhet az összekapcsolás. Mivel az Orders és az Order Details tábla is rendelkezik OrderID mezővel, így ez alapján a két tábla összeköthető. Ehhez a művelethez a DataSet osztályt kell felhasználnunk, azon belül is a Relations property-t. Mivel több tábla is került a DataSet objektumába, így tetszőleges számú kapcsolat ki is alakítható ezen adatok között. Ezért a Relations property egy kollekciót tárol a már létrehozott kapcsolatokról. Újat létrehozni az Add függvénnyel tudunk. Itt első paraméterként meg kell adnunk a létrehozandó reláció megnevezését, mely csak rajtunk múlik, hogy mi legyen. Második paraméterként a master táblában lévő azonosító mezőt kell átadni, míg harmadikként a detail tábla azonosító mezőjére van szükség. A reláció ettől kezdve él.
      ds.Relations.Add("Orders relation", ds.Tables["Orders"].Columns["OrderID"], ds.Tables["Order Details"].Columns["OrderID"]);
Ahhoz, hogy ennek eredménye látható is legyen nem kell mást tennünk, mint mondjuk egy DataGrid-hez hozzákötni a DataSet objektumunkból a fő, vagyis az Orders táblát.
      dataGrid1.SetDataBinding(ds, "Orders");
    }
A DataGrid-ben ekkor minden olyan rekord előtt, melyhez tartozik detail rekord is egy kis plusz jel lesz látható. Erre kattintva kinyílik hierarchikusan a következő szint, melyben felsorolva láthatók a kapcsolatok. Mivel most csak egyet hoztunk létre Orders relations névvel, így itt e felirat jelenik meg linkként. E linkre kattintva a DataGrid-ben a detail rekordok lesznek láthatók oly módon, hogy a táblázat felső sorába az aktuális master rekord kerül, míg alatta a detail rekordok lesznek láthatóak. A DataGrid-ben ekkor a jobb felső sarokban egy balra mutató kis nyíl is megjelenik. Erre kattintva juthatunk vissza ismét a master tábla rekordjai közé.