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.
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
user@host:~/Desktop/connector/bin$ sudo gacutil -i MySql.Data.dll
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!
using MySql.Data.MySqlClient;
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.
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.
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ány | Méret |
|---|---|
| mysqltest.txt | 1.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.