
A cikkünkben foglaltak végrehajtásához szükség van a Bob Silva által készített "_libmysq.pas" és "libmySQL.dll" fájlokra. Mindkettő letölthető a www.mysql.com címről. Mellékeltünk egy példaprogramot, melyben a kapcsolódáshoz szükséges adatok (felhasználói név, jelszó, stb.) megadása után a "Kapcsolódás" gombra kattintva létrejön egy kliens - szerver szál a programunk és a MySQL kiszolgáló között. Ezután az "SQL lekérdezés" mezőbe beírhatunk egy szabályos SQL lekérdezést és a "Lekérdezés indítása" gombbal ez végrehajtódik, majd a visszakapott eredmény a legalul található StringGrid komponensben jelenik meg.
Előkészületek
A "_libmysq.pas" és "libmySQL.dll" fájlokat másoljuk a Delphi project könyvtárába vagy más olyan helyre, ahol programunk el tudja érni. Az újonnan létrehozott project azon Unit-jának "uses" szekciójába írjuk be a "_libmysq" szót, ahonnan el akarjuk érni a MySQL adatbázisok valamelyikét.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, _libmysq, Grids;
Adatbázis kapcsolat létrehozása
Megjegyzés: az alábbi forráskód a mellékelt példaprogramban magyarázata.
A MySQL kiszolgálók kezdettől fogva azon az elven készültek, hogy az operációs rendszert és szolgáltatásait bármilyen szinten csak érvényes felhasználói névvel és jelszóval lehet elérni. Ilyen következetességgel a Windows verziókban csak a Windows 2000 megjelenésével találkozhattunk. A jogosult felhasználói fiókokat a MySQL szervert kezelő rendszergazdának kell létrehozni.
Elsőként szükségünk lesz néhány változóra. Jelentésüket felhasználásukkor ismertetjük.
host, user, passwd, db: string;
retval: Integer;
mysqlrec: mysql;
presults: pmysql_res;
prow: pmysql_row;
row: mysql_row;
i, j: Integer;
query: string;
Példaprogramunkban négy szerkesztő mezővel kérjük be a felhasználótól a szükséges adatokat. A MySQL-t futtató operációs rendszer gépnevét - függetlenül attól, hogy Windows-ról vagy Linux-ról van szó - a "host" változóban tároljuk el. Második paraméter az adatbázis nevét tárolja ("db"), ezen belül a táblákra majd a lekérdezésben tudunk hivatkozni. A felhasználói nevet a "user", míg a jelszót a "passwd" változó tartalmazza.
host:= Edit1.Text;
db:= Edit2.Text;
user:= Edit3.Text;
passwd:= Edit4.Text;
A kapcsolat létrehozása a "mysql_connect" függvénnyel lehetséges, mely a "_libmysq.pas" fájlban található. Visszatérési értéke igen összetett és a "mysqlrec" rekordba kerül (lásd később). Paraméterként át kell adni az elérendő kiszolgáló nevét ("host") a bejelentkezéshez szükséges felhasználói nevet ("user") és jelszót ("passwd").
mysql_connect(@mysqlrec, PChar(host), PChar(user), PChar(passwd));
Ha a "mysqlrec.status" értéke megegyezik a "mysql_status_ready"-vel, akkor sikerült a kapcsolat elemeinek inicializálása (ez még nem jelenti azt, hogy létre is jött a kapcsolat).
if mysqlrec.status = mysql_status_ready then
Az eredménynek megfelelően elhelyezünk egy szöveget a "Memo1" komponensben a felhasználó tájékoztatására.
begin
Memo1.Lines.Add ('A kapcsolat előkészítése rendben.');
end
else
Memo1.Lines.Add ('Nem sikerült előkészíteni a kapcsolatot.');
A következő lépés, hogy létrehozzuk az adatbázis kapcsolatot. Ehhez a "mysql_select_db" függvényre lesz szükségünk. Paraméterként az adatbázis nevét kell átadni (db). Ha a visszatérési érték nulla, akkor sikeres volt a csatlakozás.
Memo1.Lines.Add ('Kapcsolódás az adatbázishoz...');
retval := mysql_select_db(@mysqlrec, PChar(db));
if retval <> 0 then
Memo1.Lines.Add ('Nem sikerült kapcsolódni az adatbázishoz.')
else
Memo1.Lines.Add ('Az adatbázis kapcsolat létrejött.');
Más adatokra nincs szükség, létrejött egy kliens - szerver szál (processz), amit a MySQL szerver már jegyez is és készen áll az adatbázis kérések kiszolgálására.
Hibakeresés - ha nem jön létre a kapcsolat:
A kapcsolat létre nem jöttének legáltalánosabb okát a hibás kapcsolódási paraméterek megadása jelenti. Bizonyosodjunk meg róla, hogy megfelelő felhasználói nevet és jelszót írtunk be, illetve a kiszolgáló hálózaton keresztül elérhető-e. Mivel a MySQL TCP/IP protokollal kommunikál, utóbbi a következő parancssori segédprogrammal tesztelhető:
Ha kapunk választ a hálózat konfigurációja rendben van, ha nem, akkor elsőként ezt kell megoldani és csak utána próbálkozzunk az adatbázisszerver elérésével. Többféle diagnosztikai célra is használható program tölthető le a www.mysql.com címről, mind Windows, mind Linux alá.
Tábla adatainak lekérdezése
Ha már van kapcsolatunk, futtathatunk lekérdezéseket a kiszolgálón. Nagyobb adatmennyiség esetén tapasztalni fogjuk a MySQL egyik nagy előnyét a gyorsaságot (több, független cégek által elvégzett sebességi teszten szerzett első helyet).
Az SQL lekérdezést az "Edit5" komponensen keresztül kérjük be a felhasználótól.
A visszakapott eredményt a "presults" változóba fogjuk tárolni; elsőként töröljük a tartalmát.
Ismét a "_libmysq.pas" egyik függvényének meghívása következik: a "mysql_query" teszi lehetővé a lekérdezések átadását a kiszolgálónak. Visszatérési értéke ismét a "mysqlrec" rekord lesz, amit a "mysql_store_result" függvénnyel áthelyezünk a "presults" változóba. Elsőre talán kicsit körülményesnek tűnik, hogy ez még tovább kell adnunk a "mysql_fetch_row" függvény paraméterébe a tényleges adatok kinyeréséhez, de a hátralévő példákban látható, hogy nincs szó túl bonyolult dologról.
mysql_query(@mysqlrec, PChar(query));
presults := mysql_store_result(@mysqlrec);
A kapott rekordszámot a "presults.row_count" értéke tárolja: az itt található szám egyenlő a sorok számával.
if presults.row_count > 0 then
begin
Label6.Caption := 'Rekordszám ' + IntToStr(presults.row_count);
Az adatok sorban egymás után (szekvenciálisan) tárolódnak a visszatérési rekordban, ahhoz, hogy ebből táblázat legyen, két egymásba ágyazott FOR ciklust kell alkalmaznunk. Az "i" változó jelenti a sorokat, a "j" pedig az oszlopokat. Ezzel a módszerrel teljes egészében mi tudjuk meghatározni, hogy melyik adat hova kerüljön nem úgy, mint egy DBGrid-nél, ahol ez automatikusan történik. Ebből következik, hogy egy "StringGrid" komponens is alkalmassá válhat az adatmegjelenítésre.
Stringgrid1.RowCount := presults.row_count + 1;
for i := 1 to presults^.row_count do begin
prow := mysql_fetch_row(presults); row := prow^;
for j := 0 to presults^.field_count - 1 do begin
StringGrid1.Cells[j, i] := StrPas(row[j]);
end;
end;
end
else
Showmessage('Nincs adat!');
Amit mindenképpen tegyünk meg: szabadítsuk fel a "presults" által lefoglalt memória területet a "mysql_free_result" függvénnyel.
finally
mysql_free_result(presults);
end;
Új sor beszúrása a táblába
A fentiek alapján nem jelentenek újdonságot a következő műveletek. Azt, hogy sorokat szúrunk be, módosítunk vagy törlünk tisztán SQL parancsokkal adjuk meg, programunk alig igényel változtatást. Például egy új sor beszúrása az "egyenleg" nevű táblába az "ft01" nevű oszlopnak 12300-as értéket adva a következő módon lehetséges.
query := 'insert into egyenleg set ft01=12300';
presults := nil;
try
mysql_query(@mysqlrec, PChar(query));
presults := mysql_store_result(@mysqlrec);
finally
mysql_free_result(presults);
end;
Tábla sorainak törlése
Az alábbi példában töröljük az "egyenleg" táblából az összes sort, ahol az "ft01" oszlop értéke nulla.
query := 'delete from egyenleg where ft01=0';
presults := nil;
try
mysql_query(@mysqlrec, PChar(query));
presults := mysql_store_result(@mysqlrec);
finally
mysql_free_result(presults);
end;
Meglévő adatok módosítása
Utolsó példánkban 1-re módosítjuk az "egyenleg" nevű tábla összes sorában az ft01 oszlop értékét, ahol a jelenlegi érték kisebb, mint nulla.
query := 'update egyenleg set ft01=1 where ft01 < 0';
presults := nil;
try
mysql_query(@mysqlrec, PChar(query));
presults := mysql_store_result(@mysqlrec);
finally
mysql_free_result(presults);
end;
Cikksorozatunk következő, befejező részében a MySQL kiszolgálók sokkal nagyobb kényelmet biztosító - és sok esetben programozást sem igénylő - ODBC eléréséről lesz szó.