HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

MySQL szerverek elérése Delphi-ből


MySQL 2. rész

Példaprogram letöltése

4827 bájt

Folytatjuk a MySQL adatbázisok Delphi-ből történő eléréséről szóló cikksorozatunkat. Ma egy régebbi, kevésbé rugalmas - de jól működő - megoldást fogunk ismertetni. A módszer előnye, hogy gyakorlatilag független a Delphi verzióktól, így egy Standard kiadáson is megvalósíthatunk adatbázis kezelést. A kényelem hiánya abban mutatkozik meg, hogy mindent le kell programozni, bár rendelkezésünkre áll néhány előre elkészített függvény.

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ő:
ping kiszolgálónév
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.
   query := Edit5.Text;
A visszakapott eredményt a "presults" változóba fogjuk tárolni; elsőként töröljük a tartalmát.
    presults := nil;
    try
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ó.

Cikksorozat

#IDKategóriaCikk címeSorozat
1488DelphiMS SQL tárolt eljárások1. rész
1499DelphiMS SQL tárolt eljárások2. rész
1507DelphiMS SQL tárolt eljárások3. rész
1519DelphiMS SQL tárolt eljárások4. rész
1526DelphiMS SQL tárolt eljárások5. rész
1537DelphiMS SQL tárolt eljárások6. rész
1546DelphiMS SQL tárolt eljárások7. rész
1553DelphiMS SQL tárolt eljárások8. rész
1564DelphiMS SQL tárolt eljárások9. rész
1573DelphiMS SQL tárolt eljárások10. rész
1582DelphiMS SQL tárolt eljárások11. rész
1591DelphiMS SQL tárolt eljárások12. rész
1600DelphiMS SQL tárolt eljárások13. rész
1609DelphiMS SQL tárolt eljárások14. rész
1617DelphiMS SQL tárolt eljárások15. rész
1626DelphiMS SQL tárolt eljárások16. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2002 évkönyv 471. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |