MySQL adatbázis kezelése a Monóval

Egy adatbázis-alapú alkalmazás fejlesztésénél kulcsfontosságú, hogy milyen adatbázismotort választunk. Ezzel a leírással azoknak szeretnék segítséget adni, akik - hozzám hasonlóan - C# nyelven programoznak és egy MySQL adatbázishoz szeretnének hozzáférni az alkalmazásukból.

Még az elején megjegyezném: a leírás feltételezi, hogy van egy működő Mono telepítés a számítógépen, ezért a Monóval kapcsolatos hibákra nem fogok kitérni e leírás keretein belül.

A következőkben egy egyszerű példa segítségével meg fogjuk nézni, hogyan lehet kapcsolódni egy MySQL szerverhez, hogyan küldhetünk el egy SQL-kérést, és mi a módja a szerver által küldött adatok feldolgozásának. De még mielőtt belevágnánk, nézzük meg, milyen lehetőségek állnak rendelkezésre egy MySQL adatbázis elérésére!

Használhatjuk a beépített ByteFX függvénykönyvtárat, vagy letölthetjük a MySQL saját fejlesztésű, rendszeresen frissített függvénykönyvtárát, a MySQL Connectort. A ByteFX függvénykönyvtárral nem érdemes foglalkozni, ugyanis meglehetősen elavult, és a Mono hivatalos oldalán olvasható információk szerint nem is várható, hogy a jövőben fejleszteni fogják. A MySQL Connector ezzel szemben könnyedén telepíthető, gyors és a fejlesztése folyamatosan zajlik. Az alábbi lépéseket követve néhány perc alatt elvégezhető a telepítés és a konfigurálás.

  1. Töltsük le a MySQL Connector 5.0-s változatát a Munkaasztalra!
    (http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-5.0...)

  2. Nyissunk egy konzolt, majd adjuk ki az alábbi parancsokat:

    user@host:~$ cd Desktop
    user@host:~/Desktop$ unzip mysql-connector-net-5.0.8.1-noinstall.zip -d connector
    user@host:~/Desktop$ cd connector/bin

  3. Telepítés Ubuntu alatt:

    user@host:~/Desktop/connector/bin$ sudo gacutil -i MySql.Data.dll

  4. Telepítés más Linux disztribúcióknál:

    user@host:~/Desktop/connector/bin$ su
    user@host:/home/Desktop/connector/bin# gacutil -i MySql.Data.dll
    user@host:/home/Desktop/connector/bin# exit

Zárjuk be a konzolt, majd indítsuk el a MonoDevelopot!

  1. Hozzunk létre egy új konzolos C# projektet (File -> New project...)!
  2. Adjunk hozzá a projekthez egy assembly referenciát! Kattintsunk a jobb egérgombbal a References menüre a bal oldali panelen, majd válasszuk ki az Edit references menüpontot!
  3. Váltsunk át a .Net Assembly fülre, majd keressük ki a Mono GAC könyvtárát (ezt alapértelmezés szerint a /usr/lib/mono/gac helyen fogjuk megtalálni). Itt keressük meg a MySQL.Data alkönyvtárat, majd a telepített MySQL Connector verziójának megfelelő könyvtárból jelöljük ki a MySQL.Data.dll fájlt! Az Add gombra kattintva bekerül a fájl a referenciák közé.
  4. A következő lépés, hogy megadunk a forráskód elején egy using kulcsszót. Innentől kezdve szabadon hozzáférhetünk a MySQL Connector által biztosított függvényekhez, eljárásokhoz, eseményekhez stb. Illesszük be az alábbi sort közvetlenül a using System; sor alá:
using MySql.Data.MySqlClient;

Kapcsolódás a szerverhez

Mostmár minden rendelkezésre áll ahhoz, hogy kapcsolódni tudjunk adatbázisunkhoz. A kapcsolat létrehozásának első fázisa, a kapcsolódási karakterlánc létrehozása:

string connstr =
"Server=localhost;" +
"Port=3306;" +
"Database=mysql;" +
"UID=username;" +
"Password=password;" +
"Charset=utf8;";

A kapcsolódási sztring tulajdonképpen egy egyszerű paraméterlista, amit egy karakterláncban tárolunk el. A paraméterek megadásakor fontos, hogy az alábbi formátumot használjuk:

Paraméternév=érték;

A fenti sztringben megadott paraméterek segítségével már gond nélkül létrehozható a kapcsolat egy MySQL szerverrel. A Charset paramétert kiemelném. Mivel a modern Linux rendszerek alapértelmezésben UTF-8 karakterkódolást használnak, ezért érdemes ezt a beállítást megadni az adatbázis-kapcsolathoz is, ezzel kivédve az ékezetproblémák esetleges előfordulását. A MySQL szerverek ugyanis szeretnek alapértelmezésben latin1-es kódolást használni a kapcsolatokhoz, amiben köztudottan nem, illetve nem megfelelően szerepelnek a magyar ékezetes betűk.

A következő lépés egy objektum létrehozása, ami magát az adatbázis-kapcsolatot fogja képviselni a programban:

MySqlConnection connection = new MySqlConnection(connstr);

Kapcsolódjunk a szerverhez:

connection.Open();

Ha valami oknál fogva nem sikerült kapcsolódni, akkor a MySQL Connector egy kivételt generál. Ennek kezeléséről feltétlenül gondoskodni kell! Erre később még kitérünk. Most tekintsünk el a hibalehetőségektől, tegyük fel, hogy sikerült kapcsolódni a szerverhez.

Lekérdezések futtatása

Kezdjük el a párbeszédet a kiszolgálóval! Első körben kérjük meg a szervert, hogy a rekordok összevetésénél használja az utf8_hungarian_ci beállítást! Bármilyen parancsot is szeretnék lefuttatni, az első lépés, hogy létrehozunk egy MySqlCommand objektumot:

MySqlCommand command = connection.CreateCommand();

Ezután adjuk meg a lekérdező utasítást a CommandText tulajdonságban:

command.CommandText = "set collation_connection=utf8_hungarian_ci";

Egy lekérdezés futtatásához háromféle függvény is rendelkezésre áll, ezek közül kettőt fogunk gyakran használni: az ExecuteNonQuery és az ExecuteReader függvényeket. A két függvény nagyban hasonlít egymáshoz, a különbség csupán annyi, hogy előbbi segítségével csak egy visszatérési értéket kapunk (egy egész számot) a parancs lefuttatása után, utóbbinál pedig a lekérdezés eredményeként visszaadott adatokat tudjuk elérni. Tehát, jelen esetben az ExecuteNonQuery függvényre van szükségünk, mivel nem adatokat szeretnénk lekérdezni, csak egy utasítást adunk a szervernek:

command.ExecuteNonQuery();

Ezzel meg is volnánk, mostmár megfelelően fognak megjelenni az ékezetes karakterek a programunkban. Most nézzünk meg egy SELECT lekérdezést! Kérdezzük le a saját felhasználónk jogosultságait és egyéb adatokat a mysql.user táblából:

MySqlCommand command2 = connection.CreateCommand();

// Szükség van egy MySqlDataReader objektumra, ha adatokat kérdezünk le
MySqlDataReader Reader;

// Írjuk be saját felhasználónevünket:
command2.CommandText = "select * from mysql.user where user = 'user_neve'";
Reader = command2.ExecuteReader();

// Létrehozunk egy
tömböt, ami éppen annyi elemből áll,
// ahány mező szerepel a lekérdezésben:
string[] data = new string[Reader.FieldCount];

// A Read() függvény feladata, hogy a rekordmutatót továbbléptesse a következő rekordra.
// Ha nincs több rekord, a függvény false értéket ad vissza.
while (Reader.Read())
for(int i=0;i<Reader.FieldCount;i++)

// A GetValue függvénnyel tudjuk lekérdezni az egyes mezők értékeit:
data[i] = Convert.ToString(Reader.GetValue(i));

Most írassuk ki a lekérdezett adatokat a képernyőre:

Console.WriteLine("A lekérdezett adatok:");
for (int i=0;i<data.Length;i++)
{
Console.Write(data[i]+" | ");
}

A fentiek ismeretében szinte bármilyen bonyolult lekérdezést le tudunk futtatni, és fel tudjuk dolgozni a visszaadott adatokat.

Kivételkezelés

Mint ahogyan említettem a cikk elején, a MySQL Connector egy kivételt generál, ha valami oknál fogva nem sikerül kapcsolódni a kiszolgálóhoz, vagy ha egy lekérdezés futtatásakor hibát jelez a szerver. Ezt a kivételt a jól ismert try...catch kódblokkok segítségével kezelhetjük le:

try
{
MySqlConnection connection = new MySqlConnection(connstr);
connection.Open();
}
catch(MySqlException ex)
{
Console.WriteLine("Hiba történt a kapcsolódás során: "+ex.Number+" - "+ex.Message);
}

A catch részben szereplő MySqlException objektum magában foglal minden olyan tulajdonságot, ami a hibával kapcsolatos adatokat tárolja, így például a hiba kódját és a szerver által visszaadott hibaüzenetet is.

Ezeket a Number és a Message tulajdonságok segítségével érhetjük el, ennek köszönhetően könnyedén készíthetünk magyar nyelvű hibaüzeneteket is egy switch...case elágazással, melyben a hibakód függvényében kiírathatjuk a hiba pontos meghatározását (pl. rossz felhasználónév/jelszó, a szerver nem érhető el, hibás a lekérdezés, stb).

A cikkhez csatolt fájlban elérhető a teljes forráskód (a kiterjesztés ne tévesszen meg senkit, az alapértelmezett .cs kiterjesztéssel nem tudtam feltölteni).

Fontos: fordításhoz feltétlenül a gmcs-t használjuk. Sima mcs-sel nem fog lefordulni a kód, mivel a MySQL Connector 2.0-s .NET verzióra íródott.

CsatolmányMéret
mysqltest.txt1.63 KB

Hozzászólások

Úgy látom, hogy a MySql

Úgy látom, hogy a MySql Connector egy Ado .Net-re épülő dolog és az lenne a kérdésem, hogy lehet e az Ado .Net nélkül megoldani a MySql-hez való csatlakozást és adatkezelést, vagy a .Net világában csak az Ado.Net-en keresztül lehet adatbázisokat kezelni?

ADO.NET

Igen, valóban ADO.NET-re épül a .NET/Connector, de nem értem, miért lenne ez probléma?
Egyébként meg, szerintem nincs más megoldás az adatkezelésre .NET környezetben. Ha tévedek, javítson ki valaki.

codepage 1252

Én kezdőként telepítettem a MySql.Data.dll-t, de csak xsp-hez akartam használni. Két problémába is ütköztem, aminek a megoldásait közlöm, hátha másoknak hasznára lesz.
- Az első problémám volt, hogy hogyan érja el a telepített dll-t a weblapom? (A bejegyzés szerint ugye a monodevelop menüjét kellett volna használni, ám nálam sajnos nem települ ez a program.) A válasz azonban egyszerű:
Az alkalmazás mappájában lévő (vagy létrehozandó) web.config fájlba kell betenni a következő részt:

<configuration>
<system.web>
<compilation>
<assemblies>
<add assembly="MySql.Data, Version=5.1.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
</assemblies>
</compilation>
</system.web>

Ahol az assembly sor után a gacutil -l listában a mysql-re vonatkozó sor értéke szerepel.
- A második bajom az volt, hogy miután elindult a weboldal, kódlap hibát adott. Erre a megoldás, a libmono-i18n* csomagok telepítése volt.