Adatbázis kezelés - DAO (Data Access Objects) programozás Visual Basic-ben

Az előző alkalommal ízelítőt kaphattunk az ADO objektummodell segítségével történő adatbázis kezelésről. Mivel azonban az ADO telepítése bizonyos esetekben (ezekről később) igen nehézkes lehet, ezért úgy döntöttem bemutatom az ADO egyik elődjét, a szintén igen könnyen és rugalmasan kezelhető DAO (Data Access Objects) objektumgyűjteményt.

Mi is az a DAO?

A DAO elnevezés egy olyan objektumgyűjteményt takar, mely segítségével helyi vagy távoli adatbázis adataihoz férhetünk hozzá, illetve lehetővé teszi az adatbázis és annak objektumai és szerkezete kezelését. Segítségével igen sok fajta adatbázis formátum kezelhető (MS Access, dBase, Paradox, FoxPro, stb). Objektumgyűjteménye egy teljesen adatbázis - független felületet nyújt a programozóknak.

A DAO két különböző ún. munkaterületet támogat:

  • Microsoft Jet munkaterület
  • ODBC Direct munkaterület
Mivel a példaalkalmazásban Microsoft Jet munkaterületet használtam, ezért nézzük mit is takar ez a kifejezés. Ez a munkaterület az ún. Microsoft Jet adatbázis-motorra (engine) épül, és rajta keresztül éri el a megadott adatforrást, ami lehet Microsoft Jet adatbázis (.mdb fájl), ODBC adatforrás vagy ISAM1 adatbázis. A Jet munkaterület segítségével tehát lehetőségünk van különböző adatbázis formátumok összekapcsolására.

DAO objektummodell Microsoft Jet munkaterületen

Röviden tekintsük át milyen objektumokkal és objektum-gyűjteményekkel dolgozhatunk egy Jet munkaterületen.

Összesen 17 különböző DAO objektumtípus létezik, és ezek között van néhány, amely csak bizonyos munkaterületeken használható. Nézzük meg mely objektumok használhatók Microsoft Jet munkaterületen (1. ábra).

  • DBEngine objektum
    A DAO legfelső szintű objektuma. Ez az objektum tartalmazza a DAO összes többi objektumát. Több példány nem hozható létre belőle, és ez az egyetlen objektum, amelynek nincs gyűjteménye.
     
Tulajdonságok:
 
Version Megadja a DAO verziószámát.
DefaultPassword Az alapértelmezett Workspace objektum felhasználó azonosítóját adhatjuk meg.
DefaultUser Az alapértelmezett Workspace objektum felhasználó jelszavát adhatjuk meg.
DefaultType A itt adhatjuk meg, hogy milyen típusú adatbázis-kapcsolatot használjanak a későbbiekben létrehozott Workspace objektumok (Microsoft Jetet vagy ODBCDirectet)
LoginTimeout Itt állíthatjuk be az ODBC bejelentkezések időkorlátját. Egy Integer típusú változó, mely másodpercekben tartalmazza azt az időt, aminek eltelte után időtúllépési hiba lép fel az ODBC bejelentkezés során. Alapértelmezés 20 másodperc. Ha 0-t adunk meg nem következik be ez a hiba. 

Metódusok
 

CreateWorkspace Egy új Workspace objektumot hozhatunk létre.

Set workspaceobj = CreateWorkspace(név, felhasználó, jelszó, típus)

  • Munkaterület: A létrehozandó workspace objektum.
  • Név: Egy string ami a létrehozandó objektumot azonosítja. 
  • Felhasználó: Az objektum tulajdonosát azonosító string.
  • Jelszó: Az objektum jelszavát tartalmazó string. Legfeljebb 14 karakterből állhat. 
  • Típus: Nem kötelező. A munkaterület típusát adja meg. (dbUseJet - Microsoft Jet munkaterülethez, dbUseODBC - ODBC Direct munkaterülethez.)
Pl.:

Dim wrkODBC as Workspace

Dim wrkJet as Workspace

'ODBC Direct munkaterület létrehozása

Set wrkODBC =CreateWorkspace("ODBCwsp","admin", "", dbUseODBC)

'Microsoft Jet munkaterület létrehozása 

Set wrkJet = CreateWorkspace("", "admin", "")

CreateDatabase Új Database objektumot hoz létre. Az adatbázis fizikailag is létrehozásra kerül a lemezen. Eredményül visszaad egy megnyitott Database objektumot (Csak Microsoft Jet munkaterületeken használható).

Set adatbázis = DBEngine.CreateDatabase (név, sorrend, egyebek)

Set adatbázis = munkaterület.CreateDatabase (név, sorrend, egyebek)

  • Adatbázis: A létrehozandó Database objektum.
  • Munkaterület: Az a létező Workspace objektum, amelyen meg szeretnénk nyitni a létrehozandó adatbázist. Ha kihagyjuk, az alapértelmezett Workspace objektumot használja. 
  • Név: Az új adatbázisfájl neve (maximum 255 karakterből álló string). A kiterjesztés megadása nem kötelező, és megadhatunk hálózati elérési utat is.
  • Sorrend: Az adatbázis létrehozásához a rendezési sorrendet megadó karakterlánc-kifejezés. Megadása kötelező! 
    Az új Database objektum részére jelszót is megadhatunk. Ehhez a sorrend argumentumba kell írnunk a jelszót, ";pwd=" kezdettel. Például:

    dbLangHungarian & ";pwd=Jelszó"

    Ha az alapértelmezett sorrenden nem akarunk változtatni, de szeretnénk jelszót megadni, akkor elég a jelszó karakterláncot beírni:

    ";pwd=Jelszó"

    A használható konstansok: 

    dbLangHungarian 

    dbLangGeneral

    dbLangSlovenian, stb
     
     

  • egyebek Nem kötelező. A következő konstansok kombinációit használhatjuk a megadásánál (összegképzéssel):
  • dbEncrypt Titkosított adatbázist hoz létre.
  • dbVersion10 1.0-s MS Jet formátumú adatbázis..
  • dbVersion11 1.1-s MS Jet formátumú adatbázis.
  • dbVersion20 2.0-s MS Jet formátumú adatbázis.
  • dbVersion30 (Alapértelmezett) 3.0-s MS Jet formátumú adatbázis. (kompatíbilis a 3.5-ös verzióval).
    A titkosítási konstans elhagyható, és a verzió konstansok közül egyszerre csak egyet adhatunk meg.
     
Pl.:

Dim dbNew as Database

'Egy adatbázist hoz létre a magyar abc szerinti rendezéssel, valamint használ kódolást

Set dbNew = wrkDefault.CreateDatabase("NewDB.mdb", _

DbLangHungarian, dbEncrypt)

CompactDatabase
  • Tömörített másolatot készítés egy lezárt adatbázisról 
  • Lehetőséget nyújt a verziószám, a rendezési sorrendet és a titkosítás módosítására. (Csak Microsoft Jet munkaterületen használható.)
DBEngine.CompactDatabase régi adatbázis, új adatbázis, sorrend, egyebek, jelszó
  • régi adatbázis: A létező adatbázis elérési útja kiterjesztéssel. 
  • új adatbázis: A létrehozandó adatbázis elérési útja. Nem egyezhet meg a régi adatbázis nevével.
  • Sorrend: Nem kötelező. Az új adatbázis rendezési sorrendje. Ha kihagyjuk, a rendezési sorrend nem változik.
    Jelszó megadása megegyezik az adatbázis létrehozásnál leírtakkal.
  • Egyebek: Nem kötelező. Konstansok kombinációja a titkosítással és a verzióval kapcsolatban. (lsd. CreateDatabase)
  • Jelszó: Nem kötelező. Csak ha az adatbázist jelszóval akarjuk védeni. Ha a sorrend argumentumban már megadtuk a jelszót, az itteni beállítás érvénytelen lesz.
Pl.:

'Az Old.mdb másolása New.mdb névre magyar sorrenddel, 3.0-s Jet verzióban kódolással

DBEngine.CompactDatabase "Old.mdb", "New.mdb", dbLangHungarian, dbVersion30 + dbEncrypt

OpenDatabase Megnyit egy adatbázist az adott, vagy az aktuális Workspace objektumon és visszaad egy Database objektumhivatkozást.

Set adatbázis = DBEngine.OpenDatabase (adatbázisnév, beállítások, írásvédett, kapcsolat)

Set adatbázis = munkaterület.OpenDatabase (adatbázisnév, beállítások, írásvédett, kapcsolat)

  • Adatbázis: Az adott Database objektum..
  • Munkaterület: Nem kötelező. Az a létező Workspace objektum amelyen az adatbázist meg szeretnénk nyitni. Ha nem adjuk meg, az alapértelmezett munkaterületet használja.
  • Adatbázisnév: A Microsoft Jet adatbázisfájl neve vagy egy ODBC adatforrás (DSN) neve. 
  • Beállítások: Nem kötelező. 
    True Az adatbázist kizárólagos módban nyitja meg.

    False (Alapértelmezett) Megosztott módban történő adatbázis megnyitás.

  • Írásvédett: Nem kötelező. 
    True: az adatbázis írásvédett módban kerül megnyitásra 

    False: (alapértelmezett) módosítható az adatbázis

  • Kapcsolat: Nem kötelező. A különféle kapcsolati adatokat adhatunk meg.
    A kapcsolat argumentum két részből áll: az adatbázis típusa, utána egy pontosvessző (;) majd a választható részek. 

    Az első rész: "ODBC;" vagy "FoxPro 2.5;" 

    A választható argumentumok: kötetlen sorrend, de pontosvesszővel kell elválasztani őket.

    "dBASE 5.0; pwd=jelszó"

    Pár példa az egyes adatbázis típusokhoz:

    dBASE III dBASE III; 
    dBASE IV dBASE IV; 
    dBASE 5 dBASE 5.0; 
    Paradox 3.x Paradox 3.x; 
    Paradox 4.x Paradox 4.x; 
    Paradox 5.x Paradox 5.x; 
    FoxPro 2.0 FoxPro 2.0; 
    FoxPro 2.5 FoxPro 2.5; 
    FoxPro 2.6 FoxPro 2.6; 
    Excel 3.0 Excel 3.0; 
    Excel 4.0 Excel 4.0; 
    Excel 5.0 vagy 
    Excel 95 Excel 5.0; 
    Excel 97 Excel 97; 
    HTML Import HTML Import; 
    HTML Export HTML Export; 
    Text Text; 
    ODBC ODBC; DATABASE=adatbázis; UID= felhasználó; PWD=jelszó; DSN= adatforrásnév; [LOGINTIMEOUT= másodperc;] 

Pl.:

'Microsoft Jet adatbázis megnyitása
Set dbsMS_Jet = wrkJet.OpenDatabase("MS_Jet.mdb", _
True)
'ODBC adatforrás megnyitása
Set dbsPubs = wrkJet.OpenDatabase("Publishers", 
DbDriverNoPrompt, True, 
"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

RepairDatabase Megpróbál kijavítani egy sérült Microsoft Jet adatbázist. Ez a sérülés általában befejezetlen írásművelet során léphet fel, amit kiválthat például egy külső hibából fakadó programleállás (pl. áramszünet esetén). A metódus megpróbálja javítani a hibásnak vélt táblákat és indexbejegyzéseket.

DBEngine.RepairDatabase adatbázisnév

  • Adatbázisnév: egy string kifejezés az adatbázis fájl útvonalával.
BeginTrans, CommitTrans, Rollback Az adatbázison tranzakciók kezelését megvalósító metódusok. 
  • BeginTrans: elindít egy tranzakciót az aktuális munkaterületen
  • CommitTrans: lezárja az aktuális tranzakciót, és menti a változtatásokat
  • Rollback: lezárja az aktuális tranzakciót, és visszaállítja a tranzakció előtti állapotokat
munkaterület.BeginTrans | CommitTrans | Rollback

Microsoft Jet munkaterületen előfordulhat, hogy néhány ISAM adatbázis nem támogatja a tranzakciókat. Azt hogy ez mely esetekben fordul elő, az adott Database vagy Recordset objektum Transactions tulajdonságának False értékéből tudhatjuk meg (erről majd később). Amire még különösképpen oda kell figyelni az az, hogy egy adott munkaterületen végrehajtott tranzakciók a munkaterületre nézve globálisak, vagyis annak minden kapcsolatát és adatbázisát érinteni fogja.


 

Gyűjtemények:
 

Errors Az egyes DAO műveletek Error objektumait tartalmazza. Ha valamely DAO művelet során hiba generálódik, akkor minden egyes hiba egy újabb Error objektummal bővíti a DBEngine Errors gyűjteményét. A gyűjteményben az Error objektumok hierarchikusan épülnek egymásra, vagyis a gyűjtemény első objektuma kerül a legalacsonyabb szintre, a második a következő szintű hiba, és így tovább.
Workspaces A Workspaces gyűjtemények tartalmazzák a DBEngine objektum aktív (nem rejtett) Workspace objektumait. (A rejtett Workspace objektumok nincsenek gyűjteményhez fűzve, hivatkozni azon az objektumváltozón keresztül lehet rájuk, amelyhez hozzá vannak rendelve.) Új Workspace objektumokat a CreateWorksapce metódussal hozhatunk létre. Amennyiben erre az objektumra később hivatkozni szeretnénk a Workspaces gyűjteményből, akkor először ezt hozzá kell fűznünk a gyűjteményhez .

Első nekifutásnak talán ennyi elég is lesz. A mellékelt alkalmazásban ezeken túlmenően már a következő alkalommal bemutatásra kerülő Workspace, Database és Recordset objektumok kezeléséről is ízelítőt kaphattok. Addig is egy kis segítség gyanánt ajánlom figyelmetekbe az Office '97 MS Access programjának helpjét ahol bővebb információt kaphattok a DAO kezeléséről, alkalmazásáról (kitűnő tankönyv!).

Ha netán valakinél nem működne a progi, az a szükséges telepítőt letöltheti innen:

sunny.pmmf.hu/~baro/

A forráskód meg ITT van.