Adatbázisok elérése VB 6.0/ActiveX segítségével

Visual Basic nyelvi összefoglaló

F1. FELADAT: Nyelvgyakorlat

A feladat egy buborékrendező algoritmus megvalósítása. A program rendez 10 db., 0 és 100 közé eső, véletlenszerűen generált számot. Induláskor egy űrlap jelenik meg, amelyen először a rendezetlen, majd a rendezett számok vannak felsorolva. Tehát:
Segítség:
Új projekt indításakor a VB egy default űrlapot készít. Ennek megnyitásakor, azaz a program indításakor meghívódik a form_load() eseménykezelő. Ezt az eseménykezelőt kell átírni. Mivel az űrlapon nincs semmi, ezért a rutin elején meg kell hívni a show eljárást.

Az űrlapot az egérrel méretezzük át akkorára, hogy elférjen rajta a 22 sor.

Az űrlapra egyszerűen a print "kiírandó szöveg" utasítással (vagy, ha az űrlapunk neve Form1, akkor a form1.print "kiírandó szöveg" utasítással) lehet írni.

Véletlen egész számok generálása 0 és 100 között:

    randomize 'a véletlenszám-generátor inicializálása
    ...
    veletlen_szamok_tombje(i) = Int(Rnd(1) * 100)

Megoldás: buborékrendezés.vbp

VB űrlapok készítése, vezérlőelemek és eseménykezelők

Minden vezérlőelemnek számos tulajdonsága van, pl. a neve, vagy egy szövegmezőnél (TextBox) az, hogy van-e rajta gördítősáv (scrollbar). A kiválasztott objektum tulajdonságait a Properties ablakban lehet állítani. A legfontosabb vezérlőelemek (controls):

F2. FELADAT: Szebb buborékrendezés

Írjuk át az előző feladatot úgy, hogy a felhasználó maga állíthassa be a rendezendő számok számát és az értéktartományt, és ne kelljen egy futtatás után leállítani a programot. Tehát:
Segítség:
A feladat megoldásához felhasználhatjuk az előző példa rendező kódját, csak az űrlapot kell feljavítani, és megírni az eseménykezelőt. Szükség van négy szövegmezőre, négy címkére, egy keretre, és egy parancsgombra. Egyetlen eseménykezelő rutin kell csak, a Rendezés gombra kattintást figyelő. Ha a gomb neve pl. SortButton, akkor ez a rutin a SortButton_Click() nevet viseli. A rutin először leolvassa a fenti két szövegmezőből a beállított értékeket, aztán a meglévő kód segítségével generálja és rendezi a véletlen számokat.

A redim array1(200) utasítás átírja a már létező array1 tömböt egy 200 elemű tömbre, függetlenül a jelenlegi mérettől.

A kiíratáshoz át kell írni az alsó szövegmezők text tulajdonságát. A kiíró ciklus magja valami ehhez hasonló lehet:

    txtBox1.text = txtBox1.text & array1(i) & Chr(13) & Chr(10)
Vigyázat! Az illető szövegmező MultiLine tulajdonságát True értékre kell állítani, különben az összes szám egy sorba fog kiíródni, a beszúrt sortörés-karakterek ellenére.

Megoldás: buborék-form.vbp

A minta-adatbázis

A feladatokhoz szükségünk lesz egy egyszerű, de feltöltött Access mintaadatbázisra, ami Biblio.mdb néven található a gépen. Ennek a szerkezete a következő:
Kapcsolómezőként az azonos nevű mezők szolgálnak, a kulcsok vastagon írottak. A rekordok száma néhány ezer táblánként.

OLE DB, ADO, ODBC, DAO, ...

Mindez sok  egymással összefüggő technológia. Egy rövid áttekintés:
  1. Jet adatbázisokhoz való csatlakozás (Access, FoxPro, stb). Ilyenkor betöltődik a Jet Engine.
  2. ODBCDirect Programozott adatelérést tesz lehetővé egy speciális, felhasználó által létrehozott  munkaterületen keresztül. A kiválasztott adatforrásnak SQL parancsokat lehet  adni (de csak adatmanipulációsat. pl. CREATE TABLE nem megy).

Az ADO Data Control 6.0 és az AdoDB.Recordset

Ahhoz, hogy egy ADO Data Controlt („adodc-t”) használhassunk, először fel kell vennünk a projektbe:

Az  adodc vezérlőelem használata

Ez a vezérlőelem az ADO szabvány szerinti adatelérést teszi lehetővé. A vezérlőelem a beállítások alapján egy rekordhalmaz-objektumot (recordset) produkál, ami úgy viselkedik, mint egy normál adatbázis-tábla. Azonban, ha futás közben a beállítások (pl. a RecordSource) megváltoznak, megváltozhat a rekordhalmaz is! Programozottan az adodc vezérlőelem Refresh metódusának a meghívásával lehet  frissíteni a produkált rekordhalmazt.

Az adodc vezérlőelem által produkált tábla megjelenítését mindazon vezérlőelemekkel elvégezhetjük, amelyeknek van DataSource és DataField tulajdonságuk (ún. data-bound, adathoz köthető veérlőelemek). Ilyenek a Label, Image, TextBox, ComboBox, ListBox, és speciálisan a DBList, DBGrid és a DBCombo (ez utóbbiak kifejezetten adatbázis-elérésre lettek kifejlesztve). Ezek közül a legegyszerűbb a TextBox használata. A DataSource tulajdonságot az adodc control nevére kell állítani, a DataField-et pedig a kívánt mezőre. Ezután az illető TextBox rákapcsolódik az adodc vezérlőelemre, folyamatosan mutatja az aktuális rekord tartalmát. A szövegmezőbe gépelt módosítások a következő rekordra lépéskor elmentődnek, hacsak a Locked tulajdonság nincs igazra állítva (és feltéve, hogy a rekordhalmaz nem read-only...).

Maga a vezérlőelem egy görgetőablakként jelenik meg az űrlapon, a vezérlőelem nevével (ami "Adodc1"):

A fenti görgetőgombok segítségével vátoztathatjuk az aktuális rekord mutatóját (cursor) a vezérlőelem által produkált táblában. Ha nem akarjuk használni a görgetőgombokat, akkor a Visible tulajdonság kikapcsolásával letilthatjuk a vezérlőelem megjelenítését.

A vezérlőelem jellemző tulajdonságai a Properties ablakban állíthatók:

A legfontosabb a Connection String, amely az adatforrás helyét adja meg. Ezt a paramétert kézzel is beírhatjuk, de egyszerűbb a „Build...” gomb megnyomására előbújó varázslóinast használni. A panel négy füle közül a Provider és a Connection füleket kell kitölteni.

Ha egy Access fájlt szeretnénk az adodc-re csatolni, akkor a képen látható választással élünk. Az inas a következő conn. stringet állítja elő:
 
Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;DataSource=C:\Program Files\Microsoft Visual Studio\VB98\Biblio.mdb

Ha SQL Serveres adatbázisra szeretnénk kapcsolódni, akkor az OLE DB Provider for SQL Server kiválasztása után meg kell adni a szerver adatait. Pl.:
 
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=Scott;InitialCatalog=TRADING;Data Source=csillag

Ebben az esteben a szerver neve csillag, a bejelentkezés utáni adatbázis a TRADING nevű adatbázis, a felhasználónév pedig Scott. Látható, hogy a választott szolgáltatótól függően más és más a string tartalma. Még egy példa ODBC-n keresztül megvalósított adatforrásra:
 
Provider=MSDASQL.1;Persist Security Info=False;User ID=Malac;DataSource=AWEDB;Initial Catalog=Northwind

Itt az AWEBD az ODBC csatorna neve, a kezdeti adatbázis a Northwind. Az ODBC szabvány előnye, hogy nem kell tudnunk, mi van a csatorna másik oldalán. Lehet egy Access vagy Excel file, de éppúgy egy Oracle szerver is. Persze a  létrehozott rekordhalmazok szolgáltatásai, az elfogadott SQL utasítások lehetőségei az ODBC meghajtótól  függenek. Ne várjuk, hogy egy Access-re telepített csatorna támogassa a szerveroldali tárolt eljárás hívását.

Az adodc-re jobb gombbal klikkelve számos fontos tulajdonságot be lehet állítani.

A Recordsource itt nem csak egy táblanév vagy SELECT lekérdezés lehet. A 4 -  Stored procedure lehetővé teszi a tárolt eljárások hívását. Mindezek a paraméterek futás közben is állíthatók.

Az adodc további fontos tulajdonságai:
CommandTimeout, ConnectionTimeout, CursorLocation, CursorType, EOFAction, BOFAction.
Ezekről lásd alább.

Az ADODB.Recordset Connection és Command objektumok nélkül is „megáll a lábán”.  Ez utóbbiakat nem részletezzük. A recordset megnyitása a


myrecordset.Open

metódushívással történik, amelynek opcionális paraméterei egy parancsszöveg (vagy egy Command Objrktum), egy  connection string (vagy egy Connection objektum), és a kurzortípus és a zártípus specifikálása. A recordset forrása lehet a kötött vezérlőelemeknek, (mint pl. a bound textbox), éppúgy, mint a data control vagy az adodc.

Navigálni az eredményül kapott  recordsetben a MoveFirst, MoveLast, MovePrevious, MoveNext, stb. metódusokkal lehet. Különböző típusú kurzorok és zárak szűkíthetik a lehetőségeket. Különbség: az AbsolutePosition 1-ről indul, nem 0-ról. Példa könyvjelzőre:


Dim konyvj As Variant
myrecordset.MoveFirst
konyvj = myrecordset.BookMark
... 'kurzor visszaállítása
myrecordset.BookMark = konyvj
... 'három rekorddal a könyvjelző utánra áll
myrecordset.Move 3, konyvj

Keresés céljára vegyük bátran igénybe a


myrecordset.Find(feltétel, [átugor], [irány], [start])

metódust. Itt a feltétel pl. "name LIKE 'A%'", az átugor a keresés kezdete relatíven a jelen kurzorálláshoz képest, az irány az irány, a startban pedig egy könyvjelzőt lehet megadni, ahonna a keresés indulni fog.

A Filter attribútum segítségével szűkíthetjük a recordsetet. pl.:


myrecordset.Filter = "name LIKE 'A%' AND pkvalue =  530"


Rendezés:

myrecordset.Sort = "name ASC,  pkvalue DESC"


Módosítások:
A mezők egy kollekció elemeiként érhetők el:

myrecordset.Fields.Item(2)
myrecordset.Fields.Item("name")
vagy
myrecordset.Item(2)
myrecordset.Item("name")

Mindenfajta  rekordművelet, módosítás lehetősége a kurzor és zártípus függvénye, ami pedig  a recordset létrjöttekor rögzül. Kurzortípusok:

A kurzor helye (CursorLocation): Zártípusok: Általában kliens oldali kurzort használunk optimista zárral és statikus kurzorral.

F3. FELADAT: Egyszerű táblanézet

Készítsünk egy olyan űrlapot, amelyik a Biblio adatbázis Titles táblájának mutatja a fontosabb mezőit, a mezők között lépkedni lehet előre/hátra, és a begépelt módosítások elmentődnek. Tehát:
Segítség:
A feladat megoldásához nem kell eseménykezelőket (egysor kódot sem) írni, csak a négy TextBox és a data control tulajdonságait kell helyesen beállítani.

Megoldás: táblanézet.vbp

A DataGrid vezérlőelem használata

A DataGrid (Microsoft Data Grid Control 6.0 (OLEDB) néven fut) segítségével flexibilisebben, táblázatkezelő-stílusban lehet egy tábla tartalmát böngészni. Ennek a DataSource tulajdonságát kell csak a meglévő adodcl-re állítani. A DataGrid megkérdezi az adodc vezérlőelemtől, milyen mezők vannak a produkált rekordhalmazban, és eszerint formázza meg az ablakát. Figyeljük meg az AllowAddnew, AllowDelete, AllowArrows, AllowUpdate tulajdonságokat! Ezek a felhasználó kurzor általi hozzáférését szabályozzák.

F4. FELADAT: Jobb adattábla-böngésző a DataGrid segítségével

Megoldás: tábla-grid.vbp

F5. FELADAT: SQL-interfész a Biblio adatbázishoz

Az előző programot könnyen át lehet alakítani úgy, hogy egy szövegablakba beírt SQL lekérdezést hajtson végre, és az eredményt a DataGrid ablakában mutassa meg:
Fontos, hogy hibás SQL esetén a program ne álljon le, hanem hibaüzenet után tegye lehetővé a szöveg javítását:
Segítség:
A legfontosabb eseménykezelő a Végrehajtás gombé. Ebben először átírjuk az adodc vezérlőelem RecordSource tulajdonságát a szövegmező által tartalmazott értékre, majd meghívjuk a data elem Refresh metódusát. Ez újrakészíti az elem rekordhalmazát. Például:

    adodc1.RecordSource = txtSQLCode.Text
    On Error GoTo hibasSQL
    adodc1.Refresh
    Exit Sub
hibasSQL:......

A közbülső hibavizsgálat magától értetődő.

A Form_Load() eseménykezelőben az adodc elem tulajdonságainak beállításával adjuk meg, hogy induláskor (mikor még nincs végrehajtható SQL) mi látszódjék a DataGrid ablakában, vagy géplejünk be egy induló RecordSource tulajdonságot. A CmdType tulajdonságot állítsuk adCmdText-re. Végül gondoskodhatunk róla, hogy a Végrehajtás gomb csak nem üres SQL kód esetén legyen megnyomható. Ez a szövegmező Change eseménykezelőjének a megadásával lehetséges:

    If Trim$(txtSQLCode) <> "" Then
        cmdExecute.Enabled = True
    Else
         cmdExecute.Enabled = False
    End If

A végrehajtás elindulhat az Enter hatására is.
Megoldás: sqlteszt.vbp

SQL-gyakorlatok

Egyelőre csak az adateléréssel (DML, data manipulaton language) foglalkozunk. A legfontosabb SQL-műveletek (query-k): A korábbiakban kifejlesztett alkalmazásunk csak lekérdező (SELECT típusú) SQL utasítások futtatását teszi lehetővé, ezért a feladatok is ilyenek lesznek.

F6. Feladat: SQL-lekérdezések

SQL tájékozódó irodalom
Írjuk meg és futtassuk le az alábbi SQL lekérdezéseket (segít a fenti SQL tájékozódó irodalom):
  1. Szeretnénk látni az adatbázisban lévő kiadók nevének a listáját (egy név csak egyszer szerepeljen).
  2. Szeretnénk egy olyan táblát látni, amelynek oszlopai a kiadó neve, a könyv címe, és a kiadás éve.
  3. Rendezzük az előző listát a kiadás éve szerint csökkenő sorrendben!
  4. Hány könyvet adtak ki 1993-ban?
Nehezebb lekérdezések:
  1. Keressük meg a legfiatalabb szerző nevét!
  2. Kíváncsiak vagyunk a 'Bramer, Susan' által (is) írt, 1995-ben New Yorkban kiadott könyv(ek) címére és ISBN számára.
  3. Kik azok, akik 'Bramer, Susan' társszerzői voltak egy vagy több könyvben? Az ő nevét nem szeretnénk látni a listában.
  4. Állítsuk elő az 1994-ben Readingban kiadott könyvek címének a listáját!
  5. A 40-nél több könyvben társszerzőként szereplő szerzők azonosítója és a publikációk száma, rendezve a publikációk száma szerint (használjunk JOIN-t!).
  6. Tervezzünk és valósítsunk meg egy ehhez hasonló bonyolultságú SQL lekérdezést!
  7. Tervezzünk és valósítsunk meg még egy ehhez hasonló bonyolultságú SQL lekérdezést!
Most állítsuk át az adodc-t az SQL-Serverre (az instructor gépen), és merüljünk el a Northwind adatbázisban. Ennek logikai sémája a következő:
Vissza a tárgy főlapjára