A cikksorozat megértéséhez szükséges némi Delphi programozási ismeret, illetve tisztában kell lenni az adatbázis kezelés alapjaival és nem árt, ha az SQL sem teljesen ismeretlen fogalom a tisztelt olvasók elott. Akiknek hiányosságai vannak e téren, azoknak javasolom az adatbázis-kezeléssel kapcsolatos cikkeinket.

Eloször átveszünk bizonyos alapfogalmakat, áttekintjük az adatbázis- architektúrákat, utána pedig beleugrunk a dolgok sűrűjébe, vagyis rátérünk, hogy ezek hogyan is valósíthatók meg Delphiben. Atvesszük az adatelérési és adatmegjelenítési komponenseket példákkal fűszerezve, majd írunk egy-két kisebb programot ahol kipróbálhatjuk a korábban tanultakat. A példaprogramok a Delphi 4-es Profesional verziójával készülnek.

Alapok

Egy adatbázis-kezelő alkalmazás esetén alapvetoen három különböző réteget különböztetünk meg. Ezek a következok: az adatszolgáltatások rétege (Data Processing), az alkalmazáslogika rétege (Business Logic) és a felhasználói felület (User Interface) rétege (megjelenítési réteg).

  1. Az adatszolgáltatások rétege (Data Processing)
    Ez a réteg felelos az adatok fizikai eléréséért, feldolgozásáért. E réteg feladata az adatbázis állományok nyitása, zárása, új adat felvitele, törlése, módosítása, indexek kezelése, zárolási konfliktushelyzetek feloldása, stb.
     
  2. Az alkalmazáslogika rétege (Bussines Logic)
    Az alkalmazáslogika rétege az adatbázisra vonatkozó szabályok összességét tartalmazza. Gyakorlatilag ebbe a rétegbe tartoznak azok a funkciók, műveletek amelyek meghatározzák egy adatbázis működését. Ilyen szabályok a mező illetve rekordszintű ellenorzések (mezőszintű ellenorzés pl. ha egy tanuló érdemjegyeinek felvitelekor a program csak egy és öt közötti értéket enged felvinni), a hivatkozási függoségek ellenorzése ( pl. egy könyvet csak akkor lehessen eladni ha az szerepel a könyvesbolt árukészletén) stb.
     
  3. Megjelenítési réteg (User Interface)
Ezek után nézzük meg milyen adatbázis architektúrák vannak, és azokban az elobb tárgyalt rétegek hogyan vannak implementálva.

Adatbázis architektúrák

  • Egygépes megvalósítás (Local Databases)

  • Az adatbázisoknak ez a leheto legegyszerűbb megvalósítási módja. Az alkalmazás egyetlen gépre íródott, az adatbázis és az azt feldolgozó program ugyanazon a gépen helyezkedik el, az adatbázist csak egyetlen program használja egy idoben. Ebben az esetben mindhárom réteg egyazon gépen helyezkedik el.
     
  • File-kiszolgáló (File-Server) architektúra

  • Ebben az esetben az adatbázis állományok átkerülnek egy központi szerverre és egy idoben több program is használhatja oket hálózaton keresztül. A szerver csak az adatok tárolására szolgál. Ezen megoldás esetén, ha a felhasználó akármilyen egyszerű adatműveletet akar is végrehajtani, az adatrekordoknak el kellett jutniuk a felhasználóhoz a hálózaton. Ez nagy adatforgalommal jár, ami a hálózat túlterheléséhez vezethet. Ezt a megoldást leginkább az xBase alapú (Dbase,FoxPro, Clipper..) adatbázis-kezelőkkel használják. Delphiben is írhatunk ilyen alkalmazásokat, de csak akkor érdemes ha nincs szükség nagy teljesítményre, aránylag kevés felhasználója van a programnak, és olcsón meg akarjuk úszni a dolgot, (mivel egy adatbázisszerver nem olcsó mulatság). Szintén mindhárom fentebb tárgyalt réteg egyazon gépen helyezkedik el.
     
  • Ügyfél-kiszolgáló (Client/Server) Architektúra

  • Az adatbázisok implementálásának e formájában az alkalmazás két részre bomlik. Az adatok közvetlen kezeléséért egy adatbázis-szervernek nevezett software a felelos, (pl. MS SQL Server, Oracle, Informix, Sybase, InterBase stb.), míg a felhasználóval való kapcsolattartás az ügyfél program feladata. Az adatbázis-servert készen vásárolhatjuk meg, míg a kliens programot mi magunk írhatjuk meg valamilyen programozási nyelven, (mint ahogy azt majd fogjuk is késobb Delphiben). Az alkalmazás logikának egy részét magába az adatbázisba, a többit a kliens programba tudjuk beépíteni. Hogy ez hogyan is történik arról majd késobb lesz szó. A client/server technológiában az ügyfél utasítja a szervert, pl. adatokat kér le, és erre a szerver visszaküldi az eredményt. Tehát nem kell a hálózaton a feldolgozandó adatoknak rekordról-rekordra átmenni a klienshez, hanem egy rövid parancs hatására, csak a ténylegesen kért, hasznos adatok fognak a szervertol a kliensig utazni, ezáltal jelentosen csökkentve a hálózati forgalmat. Igy az adatfeldolgozást a szerver végzi a kliens parancsainak hatására. E parancsok számára kidolgoztak egy szabványos nyelvet, ez az SQL. Tehát az adatbázis-szervereket ilyen SQL parancsokkal tudjuk munkára bírni. Az adatbázis szervereknek a hálózati forgalom csökkentésén kívül számos más elonyük is van, biztosítják az egyidejű adatelérést (egyszerre nagy számú felhasználó kiszolgálására képesek), az adatbiztonságot, központilag kezeli a felhasználói jogosultságokat, stb.
     
  • Több rétegű (Multi-Tier) adatbázis architektúra

  • Ebben az esetben a kliens nem közvetlenül az adatbázis-szerverhez, hanem egy vagy több köztes ún. applikációs szerverhez kapcsolódik, és végül az applikációs szerver kapcsolódik az adatbázis-szerverhez. Tehát a kliensnek a középen elhelyezkedo applikációs szervertol kapják az adatokat, ezért ezt a réteget adatszolgáltatónak (Data Broker) is nevezik. Igy az adatbázis logikát el lehet helyezni a középso rétegben, és a kliens feladata csak a felhasználóval való kapcsolattartás lesz. Az ilyen kliens-t "sovány" (thin) kliensnek nevezzük, hiszen a munka nagy részét az applikációs szerver végzi. Tehát ebben az esetben a három réteg, fizikailag is három különböző helyen helyezkedhet el.
Delphiben lehetoségünk van a fentebb említett bármelyik architektúrát felhasználva adatbázisos alkalmazást készíteni. Ezek után lássuk hogyan is lép kapcsolatba a Delphi a különböző adatbázisokkal.
 

A Borland Database Engine (Adatbázis motor)

Ahhoz, hogy egy Delphiben irt alkalmazás meg tudjon nyitni egy helyi adatbázist, illetve hogy csatlakozni tudjon egy adatbázisszerverhez, szüksége van a Borland Database Engine-re (továbbiakban BDE). Ezért ha egy adatbázisos alkalmazást készítünk és azt telepítjük egy felhasználó gépére, ahhoz hogy működjön a program, a BDE-t is telepíteni kell ugyanarra a gépre. A BDE egységes felületet biztosít a különböző formátumú adatbázisok eléréséhez, nem kell ismernünk az egyes rendszerek sajátosságait. A BDE gyakorlatilag DLL-ek és utility-k gyűjteménye, melyek segítségével különböző adatbázisokat érhetünk el egységesen Borland fejlesztoeszközökkel készített programunkból. (pl. a C++ Builder, vagy az IntraBuilder is a BDE-t használja) A Delphi minden verziója tartalmaz ún. STANDARD drivereket, melyekkel a lokális adatbázisok (Paradox, dBase) érhetok el. Ahhoz hogy különböző adatbázisszerverekhez (Oracle, Sybase, InterBase stb.) is csatlakozni tudjunk a client/server verzióra van szükség. Az adatbázis-szerverek eléréséhez a BDE az ún. SQL-links csomagot használja. Az SQL-links gyakorlatilag kiegészíto drivereket tartalmaz a BDE-hez.

A Delphi4 Standard és Professional verziójához kapjuk a Local InterBase-t, ami az InterBase szerver egy felhasználós változata. Ezt azért adják, hogy ha nem akarunk drágán adatbázisszervert vásárolni, akkor is tudjunk client/server alkalmazást készíteni. Erre sor is fog kerülni.

Igy használja egy Delphi alkalmazás a BDE-t:

BDE Aliasok (Alnevek)

A BDE álneveket (alias) használ a különböző adatbázisokra való hivatkozáskor. Az alias gyakorlatilag paraméterek halmaz, ami egyszerűbb esetben, lokális adatbázisoknál az adatbázis elhelyezkedését és típusát tartalmazza, adatbázisszerverek esetén pedig egy csomó plusz paraméter megadható, pl. a megnyitás módja, a szervernév, felhasználónév stb. Amikor elkészítjük az alkalmazásunkat, akkor abban alias-sal hivatkozunk a használt adatbázisra. Igy ha késobb pl. megváltozik az adatok elérési útvonala, az nincs fixen belefordítva a programunkba, hanem egyszerűen megváltoztathatjuk azt a késobbiek során bármikor. Alias-t a BDE Administrator-ral, a Database Explorer-rel, (A BDE Administrator az adatbázismotor konfigurációs programja, mellyel aliasokat hozhatunk létre, módosíthatunk vagy törölhetünk. A Database Explorer egy segédprogram mellyel aliasokat kezelhetünk, adatbázisokat nézhetünk meg, módosíthatunk, sql lekérdezéseket futtathatunk stb.) de akár saját magunk programból is létrehozhatunk. (Hogy hogyan, arról majd késobb). A létrehozott alias a BDE saját konfigurációs állományában (IDAPI32.CFG) kerül elmentésre, és mindaddig megmarad míg nem töröljük. Miután elindítottuk a BDE Administratort, már alapesetben is látható lesz egy pár alias, ettol nem kell megijedni, ezek példák melyeket a Delphi hoz létre amikor felinstalláljuk és a saját példa adatbázisaira mutatnak.

Igy működnek az aliasok:

Adatbázis kezelési komponensek

Ezek után nézzük melyek azok a VCL komponensek amelyek az adatbázis-kezelést hivatottak elosegíteni. Az adatbázis-kezelési komponenseket két csoportba oszthatjuk: nem vizuális adatelérési és vizuális adatmegjelenítési komponensek.

Adatelérési komponensek:

Mint a nevük is mutatja, adatok elérésére, módosítására, lekérdezésére szolgálnak. Ezek a komponensek (TDatabase, TTable, TQuery, TStoredProcs) a TDataSet os leszármazottai, így jó néhány közös tulajdonsággal rendelkeznek. A komponenseket a Data Acces palettán találjuk a Delphi fejlesztoi környezetben.

Adatmegjelenítési komponensek

Adatmegjelenítési komponensek pl. a TDBEdit, TDBGrid, TDBNavigator, stb. Ezek a Data Controls palettán találhatók. Gyakorlatilag úgy működnek mint a standard TEdit, TGrid stb. komponensek, csak az adatokat, egy adatbázis mezőjébol, vagy táblájából veszik. Egy ilyen adatmegjelenítési komponens editálása esetén az adatbázis aktuális rekordjában is módosulnak az adatok.

Az adatelérési és adatmegjelenítési komponensek nem tudnak közvetlenül egymáshoz kapcsolódni. Ahhoz hogy egy adatelérési komponens által reprezentált adatokat meg tudjuk jeleníteni egy adatmegjelenítési komponenssel, szükség van az ún. TDataSource (adatforrás) komponensre. Eloször a TDataSource kapcsolódik egy TDataSet komponenshez, majd ezután egy adatmegjelenítési komponens DataSource property-ét tudjuk ráállítani az adatforrásunkra.

Igy jelenik meg egy adat a képernyon adatmegjelenítési komponens segítségével:

Most pedig készítünk egy egyszerű kis programot annak illusztrálására, hogy milyen könnyen és gyorsan lehet bizonyos dolgokat megvalósítani Delphiben. És mindezt úgy tesszük, hogy egyetlen sor kódot sem fogunk begépelni.

Indítsuk el a Delphit, és kezdjünk egy új projectet.

  1. A Form borderstyle property-je legyen bsDialog, a Position pedig ToDesktopCenter.
  1. Dobjunk egy Tabe komponenst a Formra, és a DatabaseName property-jét állítsuk be a DBDEMOS aliasra. (ez a Borland példa adatbázisaira mutat). A TableName property pedig legyen az animals.dbf.
  1. Ezután dobjunk egy DataSource komponenst a Formra és a DataSet property-ét állí tsuk be a Table1-re.
  1. Ha ez megvan, tegyünk egy DBGrid komponenst a Formra és a DataSource property legyen a DataSource1.
  1. Most egy DBImage következik, a DataSource szintén a DataSource1, a DataField pedig BMP.
  1. A következo komponens egy DBText, a DataSource property a már megszokott DataSource1 (Egyébként más nem is lehetne, hiszen csak egy datasource komponensünk van), a DataField property pedig legyen a NAME mező.
  1. Már csak egy DBNavigator komponens van hátra, de itt se feledkezzünk meg a DataSource property beállításáról.
  1. Az adatmegjelenítési komponenseket helyezzük el ízlésesen, majd a Table1 komponens Active property-ét állítsuk True-ra. Ha mindent jól csináltunk, le se kell fordítanunk a programot máris (szerkesztési idoben) látható az adatbázis.
Ha a fenti útmutatást szorosan követtük, akkor valami ehhez hasonlónak kell megjelennie a futtatás után:

És mindehhez egyetlen karaktert sem kellett begépelni. Persze ennél komolyabb programokat is fogunk készíteni, ezt csak egy kis kedvcsinálónak szántam.
A következo cikkben nekiállunk az adatbázis-kezelési komponensek részletes ismertetésének, több példával fűszerezve.