Adatbázisok elérése VB 6.0/ActiveX segítségével
Visual Basic nyelvi összefoglaló
-
Változók és kulcsszavak nevében a kis- és nagybetűket nem különbözteti
meg
-
Nyelvi elemek
típusok: integer, string, date, ...
típusdeklaráció:
dim i as integer
dim matrix(6, 6) as integer
-
Feltételek, ciklusok
if 1<2 then
else
end if
do while 1<2
loop
do
loop while 1<2
do
...
if 2>3 exit do
...
loop until 1<2
for i=100 to 1 step -1
...
next
-
Eljárások, függvények, modulok
A VB projekt részei: űrlapok (forms) és a hozzájuk tartozó eseménykezelő
rutinok, kódmodulok (eljárások, függvények) és class modulok (objektum-osztálydeklarációk,
egy modul egy osztály). Állítható, hogy induláskor melyik űrlap kezdjen
el futni. Ha nincs egy űrlap sem, akkor a Main() nevű eljárás kezd futni.
A következő példa bemutatja a cím- ill. értékszerinti paraméterátadást
és a függvények, eljárások használatát. Mivel a Debug ablakba ír, ezért
csak a VB fejlesztőrendszerben használható! kód: cimszerint.vbp
Sub main()
Dim a As Integer
Dim b As Integer
Dim c As Integer
a = 2
b = 3
Debug.Print "cím szerinti paraméterátadás függvénynek"
c = cimszerintf(a, b)
Debug.Print "2+3= " & c & ", b=" &
b
'kiírás: 2+3=5, b=5
b = 3
Debug.Print "érték szerinti paraméterátadás
eljárásnak"
ertekszerint a, b, c
Debug.Print "2+3= " & c & ", b=" &
b
'kiírás: 2+3=5, b=3
Debug.Print "szevasz" 'erre a sorra töréspontot
teszünk
End Sub
Public Sub ertekszerint(i As Integer, ByVal j As Integer, k As Integer)
j = j + i
k = j
End Sub
Public Function cimszerintf(i, j As Integer) As Integer
j = j + i
cimszerintf = j
End Function
-
Hibakezelés
Hiba esetén az Err objektumból lekérdezhető, mi történt (kód: hiba.vbp)
Sub main()
On Error GoTo cimke
Debug.Print 2 / 0
Debug.Print "ezt te már nem látod"
Exit Sub
cimke:
MsgBox Err.Number & ". hiba: " & Err.Description,
vbOKCancel, "HIBA"
End Sub
-
Új osztályok megadása
nem lesz rá szükség.
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):
-
CommandButton, parancsgomb. A gombnev_click() nevű eseménykezelőben megadhatjuk,
mi történjen a megnyomásakor. Ilyen a következő példában a Rendezés gomb.
-
TextBox, szövegmező. A szöveges adatbevitel, és -kijelzés eszköze. A Text
nevű tulajdonsága lekérdezésével ill. átírásával szöveges adatbevitelre
használható. Ilyen a következő példában a Tömbméret és az Eredeti sorozat
mezője is.
-
Label, címke. Magyarázó szöveg.
-
Frame, keret. Esztétikai elem, lehet címe.
-
ListBox, lista. Adott számú szöveges lehetőség közüli választást tesz lehetővé.
-
ComboBox. lista+egy kiemelt sor. Három fajtája van, ebből kettő megengedi
a listában nem szereplő érték (szöveg) bevitelét is.
-
Data, adat. Adatforráshoz, adatbázishoz való csatlakozást tesz lehetővé.
Bővebben később.
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:
-
OLE DB Az OLE (Object Linking and Embedding) szabvány adateléréssel
foglalkozó része, az újabb kori MS-adattechnológia alapja. A COM (objektum-orientált)
technológia révén megadott szabvány. Az OLE DB szolgáltató (provider) minimum
3 objektumot kell, hogy megvalósítson (prog. nyelvtől függetlenül): Data
source, Session, Rowset. Vannak opcionális kiegészítő objektumok is,
pl. Command, Transaction. Az eredmények mindig Rowset formájában
állnak elő, pl a Command.Execute metódushívás után. Az OLE DB nyelvtől
és op. rendszertől függetlenül ugyanazt a felületet biztosítja a nagy relációs
adatbázisokhoz (pl. Oracle), mint az ISAM (Indexed Sequential Access Method)
alkalmazásokhoz (mint pl. Access, FoxPro, dBase, ...), a Word, vagy Excel
fájlokhoz.
-
ADO 2.0 Az OLE DB szabvány egy kiterjesztett megvalósítása, a jövőben
teljesen ez fogja átvenni az egyéb technológiák (DAO, RDO) szerepét. Fő
objektumai:
-
Connection A kapcsolatot testesíti meg (az OLE DB Session
objektuma, „Dim CN As ADODB.Connection”). Fontos metódusa az Execute,
ami a kapcsolat megnyitása után hívható, egy Recordset objektumot ad vissza.
-
Command Egy végrehajtandó parancs, pl. tárolt eljárás hívás
vagy SQL mondat (OLE DB Command objektuma). Eredménye egy Recordset.
-
Parameters A Command objektumba ágyazott kollekció, amely a parancs
paramétereit adja meg.
-
Recordset (OLE DB Rowset, DAO Recordset, RDO
Resultset).
A legfontosabb objektum, sokkal többet tud, mint a DAO-s megfelelő. Open
metódusának hívása után felttöltődik az általa tartalazott táblázat az
aktuális értékekkel.
-
Fields A Recordset objektumba ágyazott kollekció, amely az az által
tartalmazott táblázat mezőit képviseli.
-
Errors Különféle objektumok által generált hibák.
-
ODBC (Open Database Connectivity) Alapvetően nem COM alapú szabvány,
hanem egy C alapú API. Tehát, ha egy adafforráshoz (pl. SQL Server adatbázisgép
és az általa kezelt adatbázisok) ODBC meghajtót akarunk készíteni, akkor
a szabvány által megkívánt függvényeket tartalmazó DLL-t kell létrehozni,
majd regisztrálni. ODBC meghajtója szinte minden kicsit is fontos adatforrásnak
van már. A meghajtó által feldolgozott parancsok SQL alapúak. A jelenleg
definiált ODBC adatforrásokat az op.rsz. tartja nyilván, ezek lehetnek
felhasználói vagy rendszer DSN-ek (User/System Data Source Name). Nagy
előnye a hordozhatóság: a kliens programnak CSAK a DSN-t kell ismernie,
pl. a szerver nevét, címét, stb. nem. Sok minden egységesen állítható,
pl a számok, dátumok kultúrafüggő megjelenítése.
FELADAT: hozzunk létre egy ODBC csatornát (System DSN) az instructor
gépen futó SQL Server Northwind adatbázisára.
-
OLE DB Provider for ODBC Az ODBC nagy sikere miatt elkészült ennek
is az OLE DB (azaz ADO) megvalósítása. Ebben az esetben tehát az ADO objektumaival
dolgozunk, bár minden lekérdezés a használt ODBC csatornán fut végig.
-
DAO A legelső adatelérési technológia volt, és ég ma is sokszor
használják, különösen, ha az Access specialitásait kell használni, mint
pl. a „compact database”. Kétféle üzemmódban működhet.
-
Jet adatbázisokhoz való csatlakozás (Access, FoxPro, stb). Ilyenkor
betöltődik a Jet Engine.
-
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:
-
forward-only: csak előre egyesével való lépegetés Ez a default!
A RecordCount sem működik.
-
keyset: előre-hátra. A recordset az éppen aktuális állapotot mutatja,
de a hozzáadott rekordok nem látszanak
-
static: előre-hátra. Az adatbázison a mások által elkövetett
változások a recordset létrejötte után nem látszanak.
-
dynamic: előre-hátra. A változások láhatóak. Access táblán ilyen
kurzor nem lehet.
A kurzor helye (CursorLocation):
-
szerver: a kurzort a szerver kezeli, az ő speciális szolgáltatásai
is elérhetők.
-
kliens: Használhatók pl. leválasztott recordsetek is. Csak
static kurzortípus lehet.
Zártípusok:
-
Read Only
-
Pessimistic: a szolgáltató minden editált rekordot zárol.
-
Optimistic: csak az update művelet idejére zárolja a rekordokat.
-
Batch Optimistic: leválasztott recordsetnél használatos. A változások
a lokális cache-ben maradnak az UpdateBatch hívásig.
Á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):
-
kívánt tulajdonságú rekordok kiválasztása: SELECT...FROM...WHERE...
Példa: Azon könyvek címe, kiadója, és kiadási éve, melyek
kiadója New York-i székhelyű, a kiadás éve szerint rendezve:
SELECT publishers.[name], titles.[title], titles.[year published]
FROM publishers, titles
WHERE publishers.[pubid]=titles.[pubid] AND
publishers.[city]='New York'
ORDER BY [year published]
Példa: Azok az évek, amikor könyvkiadás történt:
SELECT DISTINCT [year published] FROM titles
Példa: Az adatbázisban lévő könyvcímek száma: SELECT
COUNT( title ) FROM titles
Példa: Az 1993-ban publikáló szerzők átlagéletkora. Ez
egyúttal példa a beágyazott lekérdezésre és a tábla aliasok használatára
is. Az INNER JOIN elméletileg mindig kiváltható a megfelelő SELECT
kombinációval (legfeljebb nevéhez méltó módon elszáll a Jet Engine...)
SELECT 1999-AVG([year born]) FROM authors
WHERE au_id IN
(SELECT au_id
FROM [title author] ta INNER JOIN titles ON
ta.isbn=t.isbn
WHERE [year published]=1993)
-
új rekordok beszúrása: INSERT...INTO...VALUES...
-
meglévő rekordok törlése: DELETE...FROM...WHERE...
-
meglévő rekordok módosítása: UPDATE...SET...WHERE....
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
Írjuk meg és futtassuk le az alábbi SQL lekérdezéseket (segít a fenti SQL
tájékozódó irodalom):
-
Szeretnénk látni az adatbázisban lévő kiadók nevének a listáját (egy név
csak egyszer szerepeljen).
-
Szeretnénk egy olyan táblát látni, amelynek oszlopai a kiadó neve, a könyv
címe, és a kiadás éve.
-
Rendezzük az előző listát a kiadás éve szerint csökkenő sorrendben!
-
Hány könyvet adtak ki 1993-ban?
Nehezebb lekérdezések:
-
Keressük meg a legfiatalabb szerző nevét!
-
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.
-
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.
-
Állítsuk elő az 1994-ben Readingban kiadott könyvek címének a listáját!
-
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!).
-
Tervezzünk és valósítsunk meg egy ehhez hasonló bonyolultságú SQL lekérdezést!
-
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ő: