C# - Adatbázis-kapcsolat felépítése

ADO.NET 2. rész

forráskód letöltése
A sorozat első cikkében néhány gondolat erejéig áttekintettük a .NET rendszer ADO.NET szolgáltatásának alapismereteit. Rengeteg újdonsággal találkozhatunk, melyekkel a sorozat ezen számában elkezdünk gyakorlati szempontból is ismerkedni. Folytatva az elkezdett gondolatmenetet, cikkünkben megismerkedhetünk néhány komponenssel, melyek segítségével kapcsolatot építhetünk fel egy adatforrással.
Ha vetünk egy pillantást a .NET Framework osztálykönyvtárára, akkor látható, hogy több névtérben csak azok az osztályok sorakoznak, melyek az adatbázis-műveletek elvégzését támogatják valamilyen formában. Egy egyszerű adatbázis –művelet - mint a példánkban bemutatandó lekérdezés – is több osztály felhasználását igényli ezek közül.
Ha jobban megvizsgáljuk az osztályokat, és a Visual Studio.NET IDE ToolBox palettájának Data füle alatt megtalálható komponenseket, akkor látható, hogy alapvetően kétfajta szolgáltatón (Data Provider) keresztül kapcsolódhatunk adatforrásokhoz.
Az első típusba a Data Provider for SQL Server kiszolgálón, míg a másikba a Data Provider for OLE DB kiszolgálón keresztül történő kapcsolat felépítéséért felelős osztályok találhatók. A sorozat számaiban minden osztállyal meg fogunk ismerkedni. Az első kiszolgálóhoz kapcsolódó osztályok a System.Data.SqlClient, míg a második kiszolgálóhoz kapcsolódok a System.Data.OleDb névtérben találhatók.
Ami nagyszerű a .NET rendszerben, hogy a két névtérben található osztályokat egy adott funkcióra nagyrészt azonos módon használhatjuk. Ez azt jelenti, hogy egy adatforráshoz történő kapcsolódáskor a kapcsolat felépítésért felelő objektum azonos metódusait kell meghívnunk, vagy lekérdezéskor azonos property-ben kell elhelyeznünk az SQL utasítást.
Ebben a számban nem egy konkrét osztály ismertetését tartjuk szem előtt, sokkal inkább azt próbáljuk meg érzékeltetni, hogy milyen egyszerűen lehet egy lekérdezést elvégezni a példánkhoz mellékelt adatforráson. A sorozat későbbi számaiban természetesen végig fogunk menni az egyes osztályok jellemzőin.
A mellékelt példa futtatásához csupán arra van szükség, hogy a Microsoft Access valamilyen verziójával rendelkezzünk. A példában ugyanis a projekt mappájában található Products.mdb állományt, mint adatforrást fogjuk használni, és a benne található Products adattábla adatait fogjuk lekérdezni.
A lekérdezéshez három osztályt kell felhasználnunk, ezek a következők:
  • OleDbConnection
  • OleDbDataAdapter
  • DataTable
És a DataGrid vizuális kontrolra van még szükségünk annak érdekében, hogy a kapott eredményt megjeleníthessük. Az osztályok most csak a kapcsolatfelvételért felelős OleDbConnection osztályt emelnénk ki, mely kulcs szerepet játszik az adatelérésben. Ezt az osztályt megvizsgáljuk részletesen, a másik két osztállyal részletesen a következő részben foglalkozunk. Ennek oka, hogy az OleDbConnection osztály képességei kimerülnek a kapcsolat kialakításában, míg a másik két osztály lehetőségei jóval túlmutatnak a megvalósított feladaton.
OleDbConnection osztály
A Data Provider for OLE DB kiszolgáló lehetőségeinek fizikai implementációja az osztály, mely néhány metódussal és property-vel rendelkezik. Ez a néhány tulajdongás és függvény elegendő ahhoz, hogy a kapcsolat az adott adatforrással felépüljön, majd a művelet végeztével le is záruljon. A kapcsolat-objektumot használhatjuk például Oracle adatbázis-kapcsolat felépítésére.
A munka során alapvetően két metódus használata számottevő, melyek a következők:
  • Open: a metódussal kapcsolódhatunk a megadott adatforráshoz.
  • Close: lezárhatjuk a megnyitott kapcsolatot. Fontos, hogy a zárás előtt a kapcsolat nyitott állapotban legyen, ellenkező esetben hibaüzenetet kapunk.
Az osztályt reprezentáló komponenst a Form-ra dobva elérhetjük, hogy szerkesztési időben is módosíthassuk a property-k értékét.
A property-k közül a ConnectionString értéke szerkeszthető, ekkor egy lista nyílik meg, amikor a Properties ablakban a property neve melletti nyomógombra kattintunk.
A legördülő menüben kiválaszthatunk egy korábban már konfigurált kapcsolat, vagy a kattinthatunk a <New Connection…> feliratú elemre is, hogy újat hozzunk létre. Itt segítségünkre van egy dialógusablak, melyben a kiválaszthatjuk, hogy milyen adatforráshoz szeretnénk kapcsolódni, és annak kel megadnunk a paramétereit.

A Szolgáltató feliratú fül alatt választhatunk egy listában az adatforrásokhoz rendelendő kapcsolat-kiszolgálók között. Most a Microsoft Access adatforrás eléréséhez szükséges Microsoft Jet 4.0 OLE DB Provider elemet kell választanunk.

A Kapcsolat feliratú fül alatt az első pont nyomógombjával meg kell keresnünk a merevlemezen található fizikai adatforrás állományt (.MDB állomány), majd Felhasználónév gyanánt az Admin nevet. Van mód arra is, hogy a kapcsolatot teszteljük.

A művelet végén az OK gombra kell kattintanunk, miután a Properties ablakban már megjelennek az egyes property-k értékei.
Az OleDbConnection osztályt azonban példányosíthatjuk a komponens használata nélkül is. Ekkor nem használhatjuk a szerkesztőablakokat, de erre egyébként is csak addig van szükség, amíg meg nem tanuljuk a gyakran használt adatforrások eléréséhez szükséges ConnectionString érték elkészítésének manuális módját.
Melléklet példánkban ez utóbbit választjuk, vagyis kézzel állítjuk be az objektum ConnectionString property-jét. Az IDE segítségével létrehozott karakterlánc ugyanis számtalan, számunkra érdektelen információt is elhelyez a konstansban. Ebbe az esetben csak arra kell figyelnünk, hogy a kapcsolat megnyitása előtt a property értéke legyen beállítva, és az helyes legyen.

A jellemző property-k, melyek adatai a jól megválasztott ConnectionString konstansban is megadhatók egyben, a következők:
ConnectionTimeout
Osztály: OleDbConnection
public virtual int ConnectionTimeout {get;}
Megadható egy egész szám formájában másodperces értékben, hogy mennyi időt várjon az objektum a kivétel generálás előtt akkor, amikor a kapcsolatot próbálja felépíteni, de az nem sikerül. Jelen esetben ez 15 másodperc.
Database
Osztály: OleDbConnection
public virtual string Database {get;}
Itt adható meg, hogy a kapcsolat felépítése után a művelet milyen adatbázisra fog vonatkozni, és az lesz az aktív.
DataSource
Osztály: OleDbConnection
public string DataSource {get;}
Az adatforrás nevét tartalmazza, mely lehet a szerver neve, vagy az aktuális állomány neve. Most ez a Products.mdb.
Provider
Osztály: OleDbConnection
public string Provider {get;}
A kapcsolat-szolgáltató neve, mely a ConnectionString property-ben a „Provider=” karakterlánc után szerepel. Most ez jelen esetben Microsoft.Jet.OLEDB.4.0.
State
Osztály: OleDbConnection
public virtual ConnectionState State {get;}
A kapcsolat állapotát tartalmazz egy konstansban, mely a ConnectionState felsorolt típus egy elme. Értékei: Open, Closed, Connecting (éppen kapcsolódik), Executing (éppen parancsot futtat), Fetching (éppen adatokat kérdez le).
OleDbDataadapter osztály
A sorozat későbbi számaiban részletesen foglalkozunk az osztállyal, most alapvető jellemzőjét mutatjuk be.
Az objektum végzi el a megadott kapcsolat és az SQL utasítás felhasználásával a tulajdonképpeni adatbázis-műveletet. Az SQL utasítás lehet lekérdezés, vagy módosítás is. Lekérdezéskor az eredményhalmazt helyezi el valamilyen memóriabeli adatszerkezetben, mely példánkban egy DataTable objektum. Az SQL utasításokat gyermekobjektumai segítségével végzi el, ezeket adatait külön kell megadnunk.
Jelen esetben az osztály Fill metódusát használjuk fel a lekérdezés, és az adatelhelyezés műveletére.
DataTable osztály
Az osztály tartalmazza a lekérdezett adathalmazt a memóriában. Az adathalmaz szerkezete (oszlopainak szerkezete, típusa, rekordszám) megegyezik a kapott a fizikai adathalmaz jellemzőivel.
Példa művelet
Az alkalmazás betöltődésekor végezzük el a lekérdezést a Products táblára. Ennek érdekében be kell állítanunk az OleDbConnection objektum ConnectionString property-jének értékét.
oleDbConnection1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=" + source + ";Mode=Share Deny None;Extended Properties=\"\";";
Létre kell hozunk az OleDbDataAdapter objektumot, melynek konstruktorában adjuk át a felhasználandó kapcsolat objektumot, illetve az SQL utasítást.
ad = new OleDbDataAdapter("SELECT * FROM PRODUCTS",oleDbConnection1);
Példányosítjuk a DataTable osztályt.
DataTable dt = new DataTable();
Meghívjuk az adapter osztály Fill metódusát.
ad.Fill(dt);
Majd a DataGrid objektum DataSource property-jében megadjuk, hogy a DataTable objektum tartalma legyen az adatforrás, melyet megjelenít.
dataGrid1.DataSource = dt.DefaultView;
Látható, hogy néhány sor kódolással felépíthető a kapcsolat, és megjeleníthetők a kért adatok.

ADO.NET cikksorozat

Adatbázis-kapcsolat felépítése - ADO.NET 2. rész