C# - Többszörös reláció adattáblák között

forráskód letöltése
Két héttel ezelőtti „Reláció létrehozása két adattábla között” című cikkünkben már bemutattuk, hogy miként köthetünk össze két adathalmazt programból relációba. Mostani cikkünkben azzal foglalkozunk, hogy miként használhatunk fel több adattáblát úgy, hogy azok között tetszőleges számú kapcsolatot alakítunk ki.
A megvalósítás első lépéseként a már szokásos módon létrehozunk egy kapcsolatot az MS SQL szerver Northwind példaadatbázisával.
      SqlConnection connection = new SqlConnection("Data Source="+textBox1.Text+";uid="+textBox2.Text+";password="+textBox3.Text+";initial catalog=Northwind;Connect Timeout=3");
      connection.Open();
Ezt követően több lekérdezést is futtatunk, melyek eredményét egy DataSet objektumban tároljuk el.
        DataSet ds = new DataSet();
Így lesz egy lekérdezésünk az Orders táblára.
      SqlDataAdapter da1 = new SqlDataAdapter("select * from Orders", connection);
      da1.Fill(ds, "Orders");
Lesz egy lekérdezés az Order Details táblára, mely az OrderID mezőn keresztül kapcsolódhat az Order tábla szintén OrderID nevű mezőjéhez.
      SqlDataAdapter da2 = new SqlDataAdapter("select * from \"Order Details\"", connection);
      da2.Fill(ds, "Order Details");
Készítünk egy lekérdezést a Employees táblához is. Ez szintén az Orders táblához kapcsolódhat az EmployeeID mező alapján.
      SqlDataAdapter da3 = new SqlDataAdapter("select * from Employees", connection);
      da3.Fill(ds, "Employees");
Végül a Products táblára is futtatunk egy lekérdezést. Ezt majd az Order Details tábla ProductID mezőjéhez köthetjük.
      SqlDataAdapter da4 = new SqlDataAdapter("select * from Products", connection);
      da4.Fill(ds, "Products");
E négy táblát felhasználva már elég bonyolult kapcsolatokat alakíthatunk ki.
Először létrehozunk egy Orders relations nevű kapcsolatot. Ezt az Orders és Order Details táblák között hozzuk létre a közös OrderID mező segítségével.
        ds.Relations.Add("", ds.Tables["Orders"].Columns["OrderID"], ds.Tables["Order Details"].Columns["OrderID"], false);
Ezt követően egy Employee relation nevű kapcsolatot létesítünk, szintén az Orders tábla és az Employees tábla között az EmployeeID mező segítségével.
        ds.Relations.Add("Employee relation", ds.Tables["Orders"].Columns["EmployeeID"], ds.Tables["Employees"].Columns["EmployeeID"], false);
Végül a Product relation nevű kapcsolat kerül létrehozásra. Ezt az Order Details és a Products tábla között hozzuk létre a ProductID mező segítségével.
        ds.Relations.Add("Product relation", ds.Tables["Order Details"].Columns["ProductID"], ds.Tables["Products"].Columns["ProductID"], false);
A mellékelt példában két DataGrid-et helyeztünk el. Az elsőhöz a DataSet Orders nevű tábláját kötjük, így itt alaphelyzetben az Orders lekérdezés eredménye lesz látható. Ha a sorok elején lévő kis pluszjelre kattintunk, akkor megjelenik két link. Az egyik az Orders relation, míg a másik az Employee relation kapcsolatra mutat. Látható tehát, hogy ahány relációt alakítunk ki egy táblával, itt annyi linket kapunk.
        dataGrid1.SetDataBinding(ds, "Orders");
A másik DataGrid esetén az Orders táblán belüli Orders relation nevű kapcsolatot kötjük. Ennek a megjelenítésnek az lesz a legfontosabb tulajdonsága, hogy amikor változik az aktuális sor a dataGrid1-ben, akkor a dataGrid2-ben lévő sorok is változnak, méghozzá úgy, hogy csak azok a tételek lesznek láthatóak, melyeket az első tábla adott rekordjához tartoznak.
Ha a dataGrid2-nél a sorok elején lévő kis pluszjelre kattintunk, akkor megjelenik egy link, mely a Product relation kapcsolatra mutat.
        dataGrid2.SetDataBinding(ds, "Orders.Orders relation");
      }