ODBC
Az ODBC (Open Database C
onnenctivity) a különböző adatbázisok közötti kapcsolatok szabványos nyelve. Használata a napjainkban elterjedt különböző nyelven, illetve különböző “akcentussal” beszélő adatbázis-kezelők összekapcsolásának igénye miatt fontos. Mielőtt megnéznénk magát az ODBC-t, vizsgáljuk meg a különböző kliens-szerver megoldásokat és azok kialakulását.
Hogyan működik az ODBC
Felhasználó: ODBC – CLI « ODBC « Oracle (CLI)
« dBase (dBase)
« text file (RMS)
Mit kell nyújtania?
- konverzió
- hiányzó funkciók
- hálózat függetlenség
- több forrás párhuzamos használata
- egységesítés (pl.: hibakezelések)
- egyszerű kezelések
Megoldás
: több komponens:Meghajtó
Oracle-hez
adatforrások
Meghajtó menedzser:
A felhasználó, alkalmazás által kiadott ODBC -CLI hívásokat fogadja és értelmezi is.
- Bizonyos szintaktikai ellenőrzést is végrehajt.
- Szükség
esetén betölti a megfelelő meghajtót a memóriába.- Nyilvántartja a kapcsolatokat.
- Átadja, továbbítja a kapott parancsot a megfelelő meghajtóhoz.
Előnye:
- Könnyít a felhasználónak.
- Nem kell ismerni az egyes meghajtók betöltésének feladatát.
- Egyszerű
síti az egyes funkciók elérését.- Konverziós lehetőségek.
- Könnyít a meghajtón.
- Bizonyos ellenőrzési, konvertálási funkciók átvállalása.
Meghajtók
Az egységes szabvány CLL hívásokat konvertálják adatforrás specifikus utasításokká. Felveszik a kapcsolatot a megadott adatforrással. Az adatforrás jellegétől függően más és más szintű konverziót Kell végrehajtani.
Meghajtók típusai:
Alkalmazás
ODBC-meghajtó menedzser
Text file driver ISAM
ISAM-engine
File-system
Pl: text file, dBase, Paradox, Acces, Foxpro
- A file rendszerint ugyanazon csomóponton van, mint a meghajtó alkalmazás. (logikailag)
- Itt kell a legnagyobb konverziót végezni. A megható, mint egy egyszerűsített RDBMS funkciónál a művelet
végrehajtást tekintve.- Hiányoznak belőle viszont számos RDBMS elemek, mint pl. tranzakciókeze-lés, többfelhasználó konkurens hozzáférés kezelése.
- Nem hoznak létre saját, belső indexeket sem
Alkalmazás
ODBC-meghajtó menedzser
RDBC driver
Middleware
Hálózati kezelő
Network
DBMS
Az DB adatforrás és a meghajtó rendszerint (nem mindig) két különböző csomóponton helyezkedik el. Rendszerint a DBMS hálózati komponensét használja. Pl: Oracle es
etében: a kliensnél futni kell az SQLNet-nek.Alkalmazás Alkalmazás
ODBC-meghajtó menedzser ODBC-meghajtó menedzser
ODBC-Oracle-driver ODBC-Open-Link driver
Oracle-OCI könyvtár OpenLink Request Agent
Oracle SQL Net könyvtár Open Link protokoll
SQLNet protokoll OpenLink Request Broker
Oracle RDBMS OpenLink Agent for Oracle
Oracle OCI könyvtár
Oracle RDBMS
a.) middleware nélkül b.) midlleware esetén
Három csomópont is részt vesz a kapcsolatban egy csomópont feladata, hogy vezérelje a kapcsolatokat.
Meghatók feladatai
- jogosultság
- zárolás
- tranzakció kezelés
- kódtábla konverzió
Oka: Minden RDBMS egy kicsit más SQL tájszólást használ.
+ egyedi elemek
pl: - SQL Server <> helyett != operátor épült
Egységesíteni kell az információ lekérdezés formátumát.
Pl: Milyen tábláink vannak:
Oracle USER_TABLES(table_name,…)
SQL Server Sysobject(name, uid,…
Elképzelhető, mennyi lehetséges változat létezik erre nem volt szabvány
Az ODBC szabvány függvényeket definiál a metaadatok lekérdezésére, s lehetős
éget ad az egyedi funkcionális lehetőségek lekérdezésére is.
Egy utasítás végrehajtás lépései az ODBC-n keresztül
F TM T
3.a Megkeresi, mely meghajtó szükséges a kapcsolathoz, s szükség esetén betölti.
[egy INI vagy regisztrációs állomány szolgál a szükséges driver kijelölésére]
3.b Kapcsolat leíró struktúrák allokálása a driverben
3.c Kapcsolat leíró allokálása
3.d Kapcsolat felvétel a kijelölt adatforrással
4. SQL utasítás kiadása
4.a Utasítás továbbítása a driverhez
4.b Utasítás átalakítása
message – formátumra
4.c message elüldése
4.d RDBMS feldolgozás
4.e válasz - message fogadása
OOBC részletes ismertetése
Több objektum együttműködéséhez kell. Az objektumok elérése handler-eken keres
ztül valósul meg. Egy handler az objektumot kezelő struktúra. Ez általános módszer a Windows környezetben (pl: instane, eszköz kezelő,…). A handler mechanizmusa elrejti a részleteket a külvilág elől (nem tudjuk és nem is kell tudni, hogy pontosan milyen információkat tárol a handler).A különböző típusú elemek különböző handler típusokat igényelnek. ODBC-handler típusok:
Ezek tartalmazási kapcsolata:
Session leíró
kapcsolat1 kapcsolat2 ….. kapcsolatn
utasítás1 … utasításn
Handler-módszer előnyei
: (azaz, hogy minden tevékenységhez ki kell jelölni az érintett handlert.® argumentumként hibajelzés túl komplikált, nehézkes
® globális leíró terület védelem és azonosítási nehézségeket okoz a hi
Tulajdonos, fukció szempontjából kétfajta handler-típus van:
E kettősség előnye:
Így egy kapcsolatnak mind a driver-menedzserben, mind a driver-ben van egy, esetleg különböző felépítésű azonosító handler-e. (mivek más információkra van szükség)
1.) Körnzeyet, session leíró handler
A session létesítéséhez kell
Tartalmazza:
- a többi handlert
- globális információkat pl:
- kapcsolatok darabszáma
- installált driverek azonosítása
- globális hibakódokat
- tranzakció kezelés a ODBC szinten
2.) Kapcsolat leíró handler
A kapcsolat leírása
- az adatforrás elérése (driver-szemszög)
- a driver azonosító (driver-menedsűzser szemszög)
lehet allokált vagy aktív státuszú
- tranzakció kezelés
- hibakezelés
3.) Utasítás handler
SQL utasítások végrehajtására szolgál.
Minden utasításhoz kell egy handler (OCI szemlélet)
Handlerek kezelése
Az allokálásnak allokálnia kell a handlereket a megfelelő helyen
- SQL Alloc Env (&henv) (HENV henv)
- SQL Alloc Connect (henv,&hdbc) (HDBC hdbc)
- SQL Alloc Stml (hdbc,&hstmt) (HSTMT hstmt)
S fel kell szabadítani, ha nincs már rá szükség
- SQL Free Stmt (hstmp,option)
- SQL Free Connect (hdbc)
- SQL Free Eno (henv)
Kapcsolatok felvétele
Eltérő specifikációs adatok (dBase és Oracle)
A rugalmasság biztosítására, háromféle kapcsolatfelvétel is lehet
a.) SQLConnect(ndbc,..,..,
Ez CLI szabvány. Minden szükséges paramétert a sikeres kapcsolatfelvételhez. Pl: usernev, password,…) meg kell adni a függvényben
Nem szükséges minden paramétert megadni! A rendszer (driver-manager) rákérdez egy dialógus ablakon keresztül a szükséges paraméter értékekre. A dialógus ablak felülete elüthet nem standard terminál felületek esetén, pl: MS-DOS, UNIX. Ekkor
Szükség esetén a driver-manager és driver is rákérdez
c.) SQL Browse Connect (…
Ha nem adunk meg minden szükséges információt, a kapcsolat felvételhez, akkor az ODBC visszaküld egy sztringet, melyben jelzi, hogy mire van még szüksége. Pl: UID: iser-id:?; PWD:password:?;…
Ez alapján az alkalmazás összeállíthat egy testre szabott lekérdező ablakot, majd a válaszok alapján pontosítja a kapcsolati paramétereket, s újra próbálkozik a kapcsolatfelvétellel.
SQL utasítások végrehajtása
Háromféle végrehajtási mód:
Parancs végrehajtás általános menete:
Utasítás összeállítás, elküldés ® fogadás, értelmezés ® QEP létrehozás ® eredmény visszaküldés ® eredmény fogadás
SQLExecDirect (hstmt,SQL-parancs,…)
b.) Kétfázisú végrehajtás; a QEP megörződik, s ezután többször egymásután, esetleg más-más paraméterekkel lefuttatható az utasítás.
Két független lépés:
a.) QEP elkészítése:
SQLPrepare(hstmt,SQL-param,…)
b.) Végrehajtás
SQLExec (hstmt)
c.) aszinkron végrehajtás
Ekkor tárolt eljárásokat kell meghívni, a tárolt eljárásokat a
SQLExecDirect(
Révén lehet meghívni, melyben a parancs helyén az SQL utasítás helyett egy
Call eljárás
Utasítás szerepel
Az utasítások végrehajtása lehet szinkron és aszinkron. Az aszinkron mód meghívása (nem vár a művelet végére) az
SQL set STLT option
Megfelel paraméterrel történő meghívásával történik.
Adatok olvasása a DB-ből
Itt is többféle módszer létezik az eredményadatok fogadására.
Átvett adat:
- Egy mező
- Egy rekor
- Több rekord
a.) Eg
y mező átvételeSQLGetData (hsmt, oszlopsorszám,…,változó,…)
A mezőérték átkerül a megadott változóba, Előtte be kell hozni a kívánt r
ekordot.b.) Egy sor átvétele
A hagyományos cursor-modellre épül. Itt előbb egyenként kell, külön kötni az oszlopokat
- SQLBindCol(nstmt, oszlop,…, változó)
majd jöhet a következő eredményrekord átvétele
- SQLFetch(hstmt)
ekkor a behozott rekord mezői automatikusan átkerülnek a kijelölt vált
ozókbac.) Több sor átvétele
Eltér a hagyományos cursor-modelltől
Előnye:
- hatékonyabb hálózati forgalom
- scrollozható browse ablakok megvalósítására
-SQLExtendFetch(hstmt,…)
ekkor az eredményadatokat egy C-beli struktúra tömbhöz lehet kötni. Az ODBC lehetőség ad e virtuális ablak lépésenkénti mozgatására is.
Hibakezelés
Minden függvén
y visszaad egy sikeresség- jelzőt. Ha hiba lépett fel, akkor (azaz not SQL.SUCCESS) azSQLError()
iteratív meghívásával kérdezhető le a hiba üzenetsorok.
ODBC kurzormodellje
Az ODBC a kurzor kezelésére is többféle változatot kínál fel
kurzor: - statikus
- kulcs-vezérelt
- dinamikus
a.) Statikus kurzor
A visszaadott, eredmény értékek a kurzor nyitásakor meghatározódnak (rekordok darabszáma, mező értékek). Lehet normál és scrollozható form
átum.Megvalósítási alternatívák:
- másolat a kliensnél
- ideiglenes tábla a szerveren
- zárolás a szerveren (vagy multiversion)
Megjegyzés: A művelet idejére mindenképpen konzisztens képet kell ka
pni.Más tranzakció köztes módosítása nem látható. Problematikus a módosíthatóság, ha ugyanis megengedjük, akkor hol engedjük meg, a másolatokban (aminek nincs értelme) vagy az alaptáblákban (melyeket más más módosíthatott közben® inkonzisztencia rendszerint read-only esetre el.
b.) Kulcs-vezérelt kurzor
A kurzor nyitásakor meghatározódik, hogy mely rekordok, s milyen sorrendben kerülnek be az eredményb
A menetközben változtatások a legfrissebb kép látható a mező értékeknél
Hátránya: olyan rekordok is benne maradnak a kurzorban, melyek már nem tartoznának oda a megváltozott értékük alapján.
c.) Dinamikus kurzor
Minden pillanatban az aktuális adatbázisnak megfelelt állapotot látjuk, azaz mind a rekordok darabszáma, értékei, köre változhat a kurzor kezelése során.
Megvalósítása egy szelektív indexel a DB-ben. A mozgás, scroll ezeken index alapján hajtódik végre a kurzor figyelembe veszi a menetközbeni módosításoka
Aktualitás |
Konkurencia |
Teljesítmény |
|
Statikus |
- |
++ |
-+ |
Kulcs-vezérelt |
+ |
+ |
+ |
Dinamikus |
++ |
-+ |
-+ |
Az ODBC2 csak a statikus scrollozható kurzort biztosítja minden adatforráshoz
Izolációs szintek
Fontos, hogy azt is szabályozni tudjuk, hogy mit lássunk a mások módosításaiból. B
ővebb, mint az ACID elemekben előírt. (Xbase!!)Tranzakció izolációs szintek:
- read uncommitted: megengedi a nem-véglegesített adatok olvasását
- READ COMMITTED: az aktuális cursor sort zárolja, más sor módosítható, mások eredményét láthatják
- REPEATABLE READ: mások hatásából csak a beszúrást látja
- SERIALIZABLE: nem lát semmit mások hatásából
A tranzakcióknál az
SQLSetStmtOption( )
Segítségével előírhatjuk, hogy
- Csak olvasási
- Zárolással dolgozó: olvasott adatot zárolja
- Optimista elven működő: nem zárol az olvasás és a módosítás
között (pl: Oracle)
tranzakciót igényeljen.
A zárolásnak dolgozó tranzakciót szimulálja egy ‘dumy’ update-del.
A szintek megvalósíthatósága az alkalmazott adatforrás típusától függ. Az egyes értékek nem függenek , pl:
SERIALIZARE
Izolációs szintnél elegendő csak a
READ ONLY
Konkurencia jelző, hiszen nem láthatók más tranzakciók hatásai
Adattípusok
Szükséges részletkérdés.
Az ODBC lehetőséget a
d az adatforrás DBMS speciális adattípusainak a lekérdezésére, hogy azt fel lehessen használni.Pl: CREATE TABLE utasításban
A speciális adattípusok lekérdezése:
SQLGetTypeInfo
Ez egy 15 mezőből álló típusleíró táblát ad vissza. A standard típusoknak két
típusa, osztálya van.Azért van szükség mindkettőre, mivel az ODBC-nek meg kell adni a mező és a ka
pcsolódó gazda-váltás típusát, a szükséges konvenció meghatározásához.Konformitási szintek
Konformitási szint jelzi, hogy az egyes ODBC drivernek, megvalósítások mennyit valósítanak meg a szabvány elemekben.
Előnye:
- szabványhoz köt
- a teljesítményképességet jelzi
Típusai:
- API – konformitás ( a függvény hívások körét érinti)
- SQL – konformitás (SQL utasítások körét erinti)
API – konformitás
Szintjei:
a.) Mag: a SQL-CLI (X/open)-re épül.
Előírt elemek:
- Egyszerű kapcsolatok kezelése
- SQL utasítások végrehajtása
- Lekérdezés eredményének lekérdezése változókban
- Tranzakció beállítás
- Hibakezelés
b.) első szint
- A mag
- Dinamikus kapcsolatfelvétel a gyári paraméter lekérdező fel
ület alapján- Nem-standard mezőtípusok (pl: BLOB
’s) kezelése- Le lehet kérdezni a driver lehetőségeit
- Le lehet kérdezni a speciális DBMS adattípusokat
c.) második szint
- 1.szint
- Scrollozható kurzor
- Dinamikus kapcsolatfelvétel saját felületekkel
- Katalógus lekérdezési függvények (pl: integritási szabvá-nyokhoz)
SQL – konformitás
a.) minimális
- CREATE, DROP
- SELECT, INSERT, UPDATE, DELETE (nincs aggregáció)
-
b.) mag-SQL
- minimális
- több DLL
- teljes SELECT
- több adattípus
c.) Kibővített SQL
- mag-SQL
- dátum konstansok, kezelő függvények
- outer-join
- több függvény
- tárolt eljárások
ODBC használata
1.) Driver installálás
- Control Panel
- ODBC
-
-
2.) Induló mintaprogram
A program egy text file sorait fogja kijelölni a képernyőre. A program C-nyelven, Windows környezetben készül
1.) ODBC driver létrehozás
- Vezérlő panel
- add USR DSN
Name: HELLO
Driver: MS Text Driver
Database Directory: C:\MSVC20\peldak\HELLO
2.) C-program készítés
HELLO.CPP
Egy MSVC20 –as gyári minta (HELLO) bővítése csak a változtatott rész l
eírása.-main függvényben
BOOL C the App: initInstance()
{
void sqlproba();
…
m_pMainWnd=new CmainWindow;
m_pMainWnd® ShowWindow(m_n(mdShow);
m_pMainWnd® UpdateWindow();
Sqlproba();
Return TRUE;
}
A saját próba függvény
Void sqlproba()
{
RETCODE rc; //return leíró
HEVN henv; //session leíró
HDBC hdbc //kapcsolat leíró
HSTMT hstmt //parancs handler
Char szData[MAX_DATA] //visszaadott érték tárolása
SWORD cbData //output hossz
SQLAllocEnv(&henv); //session létesítés
SQLAllocConnect(henv,&hdbc); //kapcsolat leíró foglalás
SQLConnect(hdbc,(unsigned char*) "HELLO",SQL_NTS,NULL,0, NULL,0); //kapcsolat felvétele
SQLAllocStmt(hdbc,&hstmt); //parancs leíró foglalás
SQLExecDirect(nstmt,(unsigned char*)
"SELECT * FROM Minta ", SQL_NTS); //parancs végrehajtás
for (rc=SQLFetch(hstmt);rc==SQL_SUCCESS;
rc=SQLFetch(hstmt)){ //rekordok lekérdezése
SQLGetData(hstmt,1,SQL_C_CHAR,SzData,
Siyeof(sydata),&cbData); //me
MessageBox(NULL,syData,"ODBC",MB_OK); //az eredmény kiírása
}
SQLFreeStmt(hstmt,SQL_DROP); //parancs leírás
SQLDisconnect(hdbe); //lekapcsolódás
SQLFreeConnet(hdbe); //leíró felszabadítás
SQLFreeEno(henv) //session leíró
}
3.)
- fordítás
kell include: <sql.h>
<sqlext.h>
library odbc.lib
odbccp.lib
- forrás text file létrehozása
C:\MSC20\peldak\HELLO – ban
Minta
Nevű text file. Ennek sorai lesznek az eredmény rekordok.
- futtatás
Olvasás RDBMS-ből
A feladat egy lokális Sysbase szerverhez, a hibakezelésre is ügyelve megírni a programot. Csak a fontosabb részeket adjuk meg.
SQLAllocEnv(&henv);
SQLAllocConnect(henv,Rdbc);
Rc=SQLConnect(hdbe,(unsigned char*)"sybaseminta",
Megjegyzés: A driver installálása
DSN (data source name): sysbaseminta
uses id:
password
server name <default>
data base name> sudemo
"dba", SQL.NTS,"sql",SQL_NTS);
(nev)
cf (rc!=SQL_SUCCESS) {
char sqlst[10], //ODBC SQL hibakód
char msg[100]; //hibaüzenet szövege
SDWORD nNUM;
SDWORD cbm;
While (SQLError(SQL_NULL_HENV,hdbe,SQL_NULL_HSTMT,
(unsigned char *) sqlst,&nNUM,(unsigned shar *)msg, siyeof(msg),
&chm)==SQL_SUCCESS){
Messagebox(NULL,msg,"ODBC hiba",MB_OK);
}
return;
}
(hasonló hibakezelés lehet minden függvény hívás után)
SQLAllocStmt( )
Minden oszlop lekérdezése
Type SWPD clols;
SQLExecDirect(hstmt,(unsigned char *)" select * from auto", SQL.NTS);
SQLNumResultCols(hstmt,&clols); //eredmény oszlopainak számát lekérdezi
For (rc=SQLFetch(hstmt); rc==SQL_SUCCESS; //ciklus a rekordokra
Rc=SQLFetch(hstmt)){
Inti;
For(i=1;i<=clols;i++){
SQLGetData(hstmt,i,SQL.C SCAR,Szdata,Sizeof(szData))
MessageBox(NULL,szData,"ODBC",MB.OK);
}
}
ODBC használata FoxPro-ból
A standardról ODBC lehetőségeknek csak egy szűkített változata él itt, ezek viszon
ylag kényelmesebben alkalmazhatók, mint a C++- beli formalizmus.A megadott első VFP mintaprogramot pl: 10-20-szor nagyobb és komplexebb C++ programmal lehet csak megoldani.
VFP-ODBC jellegzetessége:
- Nem kell külön definiálni, allokálni handler-eket
- Az eredmény mindig egy cursor (táblázat) struktúrába kerül, melyet közvetlenül el lehet érni a program további részében [VFP tudja kezelni a táblákat]
- Eltérő függvény azonosítók
- Egy kapcsolat egyidejűleg csak egy utasítást adhat ki
VFP-ODBL függvényei
SQLCancel(hdbc): abortálja a kapc
1-el tér vissza, ha sikeres
SQLColumns(hdbc,"tabla"): a megadott tábla szerkezetét leíró adatokat letárolja, áthozza egy cursor-ba (SQLRESOLT lesz a default neve)
SQLCommit (hdbc): tranzakció lezárás
hdbe=SQLConnect(DSN, felhasználónév, jelszó): kapcsolat kiépítés
SQLDisConnect(hdbc): kapcsolat megszakítás
SQLExec(hdbc,"SQL parancs",cursornev): parancs végrehajtás eredmény a SQLRESULT vagy a megadott cursorba kerül
SQLSETProp(hdbc,parameter,ertek): kapcsolat leírás paraméter beállítás
SQLGetProp(hdbe,parmeter): kapcsolat leíró paraméter lekérdezés
SQLRollback(hdbc): tranzakció visszajelzése
SQLTables(hdbc,táblatípus
VIEW
TABLE
SYSTEM_TABLE
Mintapélda:
handle = SQLConnect ("sysbaseminta","dba","sql")
if handle > 0
rc = SQLExec(handler,"select * from auto")
if rc>0
browse last
else
wait window ‘hiba’
endif
else
wait window ‘hibás kapcsolat’
endif
Open, standardized interface
The WEB servers can access the databases through CGI interface
Interfaces among the components:
1./4. WEB browser Û WEB server
HTML API
<FORM …. ACTION= URL>
….
</FROM>
2. WEB server Þ DBMS
CLI (usually SQL)
SQLEXEC(SQL-statement)
2. DBMS Þ WEB server
result written to standard output
HTP.PRINT(HTML-statement)
Az ODBC (Open Database C
onnenctivity) a különböző adatbázisok közötti kapcsolatok szabványos nyelve. Használata a napjainkban elterjedt különböző nyelven, illetve különböző “akcentussal” beszélő adatbázis-kezelők összekapcsolásának igénye miatt fontos. Mielőtt megnéznénk magát az ODBC-t, vizsgáljuk meg a különböző kliens-szerver megoldásokat és azok kialakulását.
Hogyan működik az ODBC
Felhasználó: ODBC – CLI « ODBC « Oracle (CLI)
« dBase (dBase)
« text file (RMS)
Mit kell nyújtania?
- konverzió
- hiányzó funkciók
- hálózat függetlenség
- több forrás párhuzamos használata
- egységesítés (pl.: hibakezelések)
- egyszerű kezelések
Megoldás
: több komponens:Meghajtó
Oracle-hez
adatforrások
Meghajtó menedzser:
A felhasználó, alkalmazás által kiadott ODBC -CLI hívásokat fogadja és értelmezi is.
- Bizonyos szintaktikai ellenőrzést is végrehajt.
- Szükség esetén betölti a megfelelő meghaj
tót a memóriába.- Nyilvántartja a kapcsolatokat.
- Átadja, továbbítja a kapott parancsot a megfelelő meghajtóhoz.
Előnye:
- Könnyít a felhasználónak.
- Nem kell ismerni az egyes meghajtók betöltésének feladatát.
- Egyszerűsíti az egyes funkciók elérését.
- Konverziós lehetőségek.
- Könnyít a meghajtón.
- Bizonyos ellenőrzési, konvertálási funkciók átvállalása.
Meghajtók
Az egységes szabvány CLL hívásokat konvertálják adatforrás specifikus utasításokká. Felveszik a kapcsolatot a megadott adatforrással. Az adatforrás jellegétől függően más és más szintű konverziót Kell végrehajtani.
Meghajtók típusai:
Alkalmazás
ODBC-meghajtó menedzser
Text file driver ISAM
ISAM-engine
File-system
Pl: text file, dBase, Paradox, Acces, Foxpro
- A file rendszerint ugyanazon csomóponton van, mint a meghajtó alkalmazás. (logikailag)
- Itt kell a legnagyobb konverziót végezni. A megható, mint egy egyszerűsített RDBMS funkciónál a művelet végrehajtást tekintve.
- Hiányoz
nak belőle viszont számos RDBMS elemek, mint pl. tranzakciókeze-lés, többfelhasználó konkurens hozzáférés kezelése.- Nem hoznak létre saját, belső indexeket sem
Alkalmazás
ODBC-meghajtó menedzser
RDBC driver
Middleware
Hálózati kezelő
Network
DBMS
Az DB adatforrás és a meghajtó rendszerint (nem mindig) két különböző csomóponton helyezkedik el. Rendszerint a DBMS hálózati komponensét használja. Pl: Oracle es
etében: a kliensnél futni kell az SQLNet-nek.Alkalmazás Alkalmazás
ODBC-meghajtó menedzser ODBC-meghajtó menedzser
ODBC-Oracle-driver ODBC-Open-Link driver
Oracle-OCI könyvtár OpenLink Request Agent
Oracle SQL Net könyvtár Open Link protokoll
SQLNet protokoll OpenLink Request Broker
Oracle RDBMS OpenLink Agent for Oracle
Oracle OCI könyvtár
Oracle RDBMS
a.) middleware nélkül b.) midlleware esetén
Három csomópont is részt vesz a kapcsolatban egy csomópont feladata, hogy vezérelje a kapcsolatokat.
Meghatók feladatai
- jogosultság
- zárolás
- tranzakció kezelés
- kódtábla konverzió
Oka: Minden RDBMS egy kicsit más SQL tájszólást használ.
+ egyedi elemek
pl: - SQL Server <> helyett != operátor épült
Egységesíteni kell az információ lekérdezés formátumát.
Pl: Milyen tábláink vannak:
Oracle USER_TABLES(table_name,…)
SQL Server Sysobject(name, uid,…
Elképzelhető, mennyi lehetséges változat létezik erre nem volt szabvány
Az ODBC szabvány függvényeket definiál a metaadatok lekérdezésére, s lehetős
éget ad az egyedi funkcionális lehetőségek lekérdezésére is.
Egy utasítás végrehajtás lépései az ODBC-n keresztül
F TM T
3.a Megkeresi, mely meghajtó szükséges a kapcsolathoz, s szükség esetén betölti.
[egy INI vagy regisztrációs állomány szolgál a szükséges driver kijelölésére]
3.b Kapcsolat leíró struktúrák allokálása a driverben
3.c Kapcsolat leíró allokálása
3.d Kapcsolat felvétel a kijelölt adatforrással
4. SQL utasítás kiadása
4.a Utasítás továbbítása a driverhez
4.b Utasítás átalakítása
message – formátumra
4.c message elüldése
4.d RDBMS feldolgozás
4.e válasz - message fogadása
OOBC részletes ismertetése
Több objektum együttműködéséhez kell. Az objektumok elérése handler-eken keres
ztül valósul meg. Egy handler az objektumot kezelő struktúra. Ez általános módszer a Windows környezetben (pl: instane, eszköz kezelő,…). A handler mechanizmusa elrejti a részleteket a külvilág elől (nem tudjuk és nem is kell tudni, hogy pontosan milyen információkat tárol a handler).A különböző típusú elemek különböző handler típusokat igényelnek. ODBC-handler típusok:
Ezek tartalmazási kapcsolata:
Session leíró
kapcsolat1 kapcsolat2 ….. kapcsolatn
utasítás1 … utasításn
Handler-módszer előnyei
: (azaz, hogy minden tevékenységhez ki kell jelölni az érintett handlert.® argumentumként hibajelzés túl komplikált, nehézkes
® globális leíró terület védelem és azonosítási nehézségeket okoz a hi
Tulajdonos, fukció szempontjából kétfajta handler-típus van:
E kettősség előnye:
Így egy kapcsolatnak mind a driver-menedzserben, mind a driver-ben van egy, esetleg különböző felépítésű azonosító handler-e. (mivek más információkra van szükség)
1.) Körnzeyet, session leíró handler
A session létesítéséhez kell
Tartalmazza:
- a többi handlert
- globális információkat pl:
- kapcsolatok darabszáma
- installált driverek azonosítása
- globális hibakódokat
- tranzakció kezelés a ODBC szinten
2.) Kapcsolat leíró handler
A kapcsolat leírása
- az adatforrás elérése (driver-szemszög)
- a driver azonosító (driver-menedsűzser szemszög)
lehet allokált vagy aktív státuszú
- tranzakció kezelés
- hibakezelés
3.) Utasítás handler
SQL utasítások végrehajtására szolgál.
Minden utasításhoz kell egy handler (OCI szemlélet)
Handlerek kezelése
Az allokálásnak allokálnia kell a handlereket a megfelelő helyen
- SQL Alloc Env (&henv) (HENV henv)
- SQL Alloc Connect (henv,&hdbc) (HDBC hdbc)
- SQL Alloc Stml (hdbc,&hstmt) (HSTMT hstmt)
S fel kell szabadítani, ha nincs már rá szükség
- SQL Free Stmt (hstmp,option)
- SQL Free Connect (hdbc)
- SQL Free Eno (henv)
Kapcsolatok felvétele
Eltérő specifikációs adatok (dBase és Oracle)
A rugalmasság biztosítására, háromféle kapcsolatfelvétel is lehet
a.) SQLConnect(ndbc,..,..,
Ez CLI szabvány. Minden szükséges paramétert a sikeres kapcsolatfelvételhez. Pl: usernev, password,…) meg kell adni a függvényben
Nem szükséges minden paramétert megadni! A rendszer (driver-manager) rákérdez egy dialógus ablakon keresztül a szükséges paraméter értékekre. A dialógus ablak felülete elüthet nem standard terminál felületek esetén, pl: MS-DOS, UNIX. Ekkor
Szükség esetén a driver-manager és driver is rákérdez
c.) SQL Browse Connect (…
Ha nem adunk meg minden szükséges információt, a kapcsolat felvételhez, akkor az ODBC visszaküld egy sztringet, melyben jelzi, hogy mire van még szüksége. Pl: UID: iser-id:?; PWD:password:?;…
Ez alapján az alkalmazás összeállíthat egy testre szabott lekérdező ablakot, majd a válaszok alapján pontosítja a kapcsolati paramétereket, s újra próbálkozik a kapcsolatfelvétellel.
SQL utasítások végrehajtása
Háromféle végrehajtási mód:
Parancs végrehajtás általános menete:
Utasítás összeállítás, elküldés ® fogadás, értelmezés ® QEP létrehozás ® eredmény visszaküldés ® eredmény fogadás
SQLExecDirect (hstmt,SQL-parancs,…)
b.) Kétfázisú végrehajtás; a QEP megörződik, s ezután többször egymásután, esetleg más-más paraméterekkel lefuttatható az utasítás.
Két független lépés:
a.) QEP elkészítése:
SQLPrepare(hstmt,SQL-param,…)
b.) Végrehajtás
SQLExec (hstmt)
c.) aszinkron végrehajtás
Ekkor tárolt eljárásokat kell meghívni, a tárolt eljárásokat a
SQLExecDirect(
Révén lehet meghívni, melyben a parancs helyén az SQL utasítás helyett egy
Call eljárás
Utasítás szerepel
Az utasítások végrehajtása lehet szinkron és aszinkron. Az aszinkron mód meghívása (nem vár a művelet végére) az
SQL set STLT option
Megfelel paraméterrel történő meghívásával történik.
Adatok olvasása a DB-ből
Itt is többféle módszer létezik az eredményadatok fogadására.
Átvett adat:
- Egy mező
- Egy rekor
- Több rekord
a.) Eg
y mező átvételeSQLGetData (hsmt, oszlopsorszám,…,változó,…)
A mezőérték átkerül a megadott változóba, Előtte be kell hozni a kívánt r
ekordot.b.) Egy sor átvétele
A hagyományos cursor-modellre épül. Itt előbb egyenként kell, külön kötni az oszlopokat
- SQLBindCol(nstmt, oszlop,…, változó)
majd jöhet a következő eredményrekord átvétele
- SQLFetch(hstmt)
ekkor a behozott rekord mezői automatikusan átkerülnek a kijelölt vált
ozókbac.) Több sor átvétele
Eltér a hagyományos cursor-modelltől
Előnye:
- hatékonyabb hálózati forgalom
- scrollozható browse ablakok megvalósítására
-SQLExtendFetch(hstmt,…)
ekkor az eredményadatokat egy C-beli struktúra tömbhöz lehet kötni. Az ODBC lehetőség ad e virtuális ablak lépésenkénti mozgatására is.
Hibakezelés
Minden függvén
y visszaad egy sikeresség- jelzőt. Ha hiba lépett fel, akkor (azaz not SQL.SUCCESS) azSQLError()
iteratív meghívásával kérdezhető le a hiba üzenetsorok.
ODBC kurzormodellje
Az ODBC a kurzor kezelésére is többféle változatot kínál fel
kurzor: - statikus
- kulcs-vezérelt
- dinamikus
a.) Statikus kurzor
A visszaadott, eredmény értékek a kurzor nyitásakor meghatározódnak (rekordok darabszáma, mező értékek). Lehet normál és scrollozható form
átum.Megvalósítási alternatívák:
- másolat a kliensnél
- ideiglenes tábla a szerveren
- zárolás a szerveren (vagy multiversion)
Megjegyzés: A művelet idejére mindenképpen konzisztens képet kell ka
pni.Más tranzakció köztes módosítása nem látható. Problematikus a módosíthatóság, ha ugyanis megengedjük, akkor hol engedjük meg, a másolatokban (aminek nincs értelme) vagy az alaptáblákban (melyeket más más módosíthatott közben® inkonzisztencia rendszerint read-only esetre el.
b.) Kulcs-vezérelt kurzor
A kurzor nyitásakor meghatározódik, hogy mely rekordok, s milyen sorrendben kerülnek be az eredményb
A menetközben változtatások a legfrissebb kép látható a mező értékeknél
Hátránya: olyan rekordok is benne maradnak a kurzorban, melyek már nem tartoznának oda a megváltozott értékük alapján.
c.) Dinamikus kurzor
Minden pillanatban az aktuális adatbázisnak megfelelt állapotot látjuk, azaz mind a rekordok darabszáma, értékei, köre változhat a kurzor kezelése során.
Megvalósítása egy szelektív indexel a DB-ben. A mozgás, scroll ezeken index alapján hajtódik végre a kurzor figyelembe veszi a menetközbeni módosításoka
Aktualitás |
Konkurencia |
Teljesítmény |
|
Statikus |
- |
++ |
-+ |
Kulcs-vezérelt |
+ |
+ |
+ |
Dinamikus |
++ |
-+ |
-+ |
Az ODBC2 csak a statikus scrollozható kurzort biztosítja minden adatforráshoz
Izolációs szintek
Fontos, hogy azt is szabályozni tudjuk, hogy mit lássunk a mások módosításaiból. B
ővebb, mint az ACID elemekben előírt. (Xbase!!)Tranzakció izolációs szintek:
- read uncommitted: megengedi a nem-véglegesített adatok olvasását
- READ COMMITTED: az aktuális cursor sort zárolja, más sor módosítható, mások eredményét láthatják
- REPEATABLE READ: mások hatásából csak a beszúrást látja
- SERIALIZABLE: nem lát semmit mások hatásából
A tranzakcióknál az
SQLSetStmtOption( )
Segítségével előírhatjuk, hogy
- Csak olvasási
- Zárolással dolgozó: olvasott adatot zárolja
- Optimista elven működő: nem zárol az olvasás és a módosítás
között (pl: Oracle)
tranzakciót igényeljen.
A zárolásnak dolgozó tranzakciót szimulálja egy ‘dumy’ update-del.
A szintek megvalósíthatósága az alkalmazott adatforrás típusától függ. Az egyes értékek nem függenek , pl:
SERIALIZARE
Izolációs szintnél elegendő csak a
READ ONLY
Konkurencia jelző, hiszen nem láthatók más tranzakciók hatásai
Adattípusok
Szükséges részletkérdés.
Az ODBC lehetőséget a
d az adatforrás DBMS speciális adattípusainak a lekérdezésére, hogy azt fel lehessen használni.Pl: CREATE TABLE utasításban
A speciális adattípusok lekérdezése:
SQLGetTypeInfo
Ez egy 15 mezőből álló típusleíró táblát ad vissza. A standard típusoknak két
típusa, osztálya van.Azért van szükség mindkettőre, mivel az ODBC-nek meg kell adni a mező és a ka
pcsolódó gazda-váltás típusát, a szükséges konvenció meghatározásához.Konformitási szintek
Konformitási szint jelzi, hogy az egyes ODBC drivernek, megvalósítások mennyit valósítanak meg a szabvány elemekben.
Előnye:
- szabványhoz köt
- a teljesítményképességet jelzi
Típusai:
- API – konformitás ( a függvény hívások körét érinti)
- SQL – konformitás (SQL utasítások körét erinti)
API – konformitás
Szintjei:
a.) Mag: a SQL-CLI (X/open)-re épül.
Előírt elemek:
- Egyszerű kapcsolatok kezelése
- SQL utasítások végrehajtása
- Lekérdezés eredményének lekérdezése változókban
- Tranzakció beállítás
- Hibakezelés
b.) első szint
- A mag
- Dinamikus kapcsolatfelvétel a gyári paraméter lekérdező fel
ület alapján- Nem-standard mezőtípusok (pl: BLOB
’s) kezelése- Le lehet kérdezni a driver lehetőségeit
- Le lehet kérdezni a speciális DBMS adattípusokat
c.) második szint
- 1.szint
- Scrollozható kurzor
- Dinamikus kapcsolatfelvétel saját felületekkel
- Katalógus lekérdezési függvények (pl: integritási szabvá-nyokhoz)
SQL – konformitás
a.) minimális
- CREATE, DROP
- SELECT, INSERT, UPDATE, DELETE (nincs aggregáció)
-
b.) mag-SQL
- minimális
- több DLL
- teljes SELECT
- több adattípus
c.) Kibővített SQL
- mag-SQL
- dátum konstansok, kezelő függvények
- outer-join
- több függvény
- tárolt eljárások
ODBC használata
1.) Driver installálás
- Control Panel
- ODBC
-
-
2.) Induló mintaprogram
A program egy text file sorait fogja kijelölni a képernyőre. A program C-nyelven, Windows környezetben készül
1.) ODBC driver létrehozás
- Vezérlő panel
- add USR DSN
Name: HELLO
Driver: MS Text Driver
Database Directory: C:\MSVC20\peldak\HELLO
2.) C-program készítés
HELLO.CPP
Egy MSVC20 –as gyári minta (HELLO) bővítése csak a változtatott rész l
eírása.-main függvényben
BOOL C the App: initInstance()
{
void sqlproba();
…
m_pMainWnd=new CmainWindow;
m_pMainWnd® ShowWindow(m_n(mdShow);
m_pMainWnd® UpdateWindow();
Sqlproba();
Return TRUE;
}
A saját próba függvény
Void sqlproba()
{
RETCODE rc; //return leíró
HEVN henv; //session leíró
HDBC hdbc //kapcsolat leíró
HSTMT hstmt //parancs handler
Char szData[MAX_DATA] //visszaadott érték tárolása
SWORD cbData //output hossz
SQLAllocEnv(&henv); //session létesítés
SQLAllocConnect(henv,&hdbc); //kapcsolat leíró foglalás
SQLConnect(hdbc,(unsigned char*) "HELLO",SQL_NTS,NULL,0, NULL,0); //kapcsolat felvétele
SQLAllocStmt(hdbc,&hstmt); //parancs leíró foglalás
SQLExecDirect(nstmt,(unsigned char*)
"SELECT * FROM Minta ", SQL_NTS); //parancs végrehajtás
for (rc=SQLFetch(hstmt);rc==SQL_SUCCESS;
rc=SQLFetch(hstmt)){ //rekordok lekérdezése
SQLGetData(hstmt,1,SQL_C_CHAR,SzData,
Siyeof(sydata),&cbData); //me
MessageBox(NULL,syData,"ODBC",MB_OK); //az eredmény kiírása
}
SQLFreeStmt(hstmt,SQL_DROP); //parancs leírás
SQLDisconnect(hdbe); //lekapcsolódás
SQLFreeConnet(hdbe); //leíró felszabadítás
SQLFreeEno(henv) //session leíró
}
3.)
- fordítás
kell include: <sql.h>
<sqlext.h>
library odbc.lib
odbccp.lib
- forrás text file létrehozása
C:\MSC20\peldak\HELLO – ban
Minta
Nevű text file. Ennek sorai lesznek az eredmény rekordok.
- futtatás
Olvasás RDBMS-ből
A feladat egy lokális Sysbase szerverhez, a hibakezelésre is ügyelve megírni a programot. Csak a fontosabb részeket adjuk meg.
SQLAllocEnv(&henv);
SQLAllocConnect(henv,Rdbc);
Rc=SQLConnect(hdbe,(unsigned char*)"sybaseminta",
Megjegyzés: A driver installálása
DSN (data source name): sysbaseminta
uses id:
password
server name <default>
data base name> sudemo
"dba", SQL.NTS,"sql",SQL_NTS);
(nev)
cf (rc!=SQL_SUCCESS) {
char sqlst[10], //ODBC SQL hibakód
char msg[100]; //hibaüzenet szövege
SDWORD nNUM;
SDWORD cbm;
While (SQLError(SQL_NULL_HENV,hdbe,SQL_NULL_HSTMT,
(unsigned char *) sqlst,&nNUM,(unsigned shar *)msg, siyeof(msg),
&chm)==SQL_SUCCESS){
Messagebox(NULL,msg,"ODBC hiba",MB_OK);
}
return;
}
(hasonló hibakezelés lehet minden függvény hívás után)
SQLAllocStmt( )
Minden oszlop lekérdezése
Type SWPD clols;
SQLExecDirect(hstmt,(unsigned char *)" select * from auto", SQL.NTS);
SQLNumResultCols(hstmt,&clols); //eredmény oszlopainak számát lekérdezi
For (rc=SQLFetch(hstmt); rc==SQL_SUCCESS; //ciklus a rekordokra
Rc=SQLFetch(hstmt)){
Inti;
For(i=1;i<=clols;i++){
SQLGetData(hstmt,i,SQL.C SCAR,Szdata,Sizeof(szData))
MessageBox(NULL,szData,"ODBC",MB.OK);
}
}
ODBC használata FoxPro-ból
A standardról ODBC lehetőségeknek csak egy szűkített változata él itt, ezek viszon
ylag kényelmesebben alkalmazhatók, mint a C++- beli formalizmus.A megadott első VFP mintaprogramot pl: 10-20-szor nagyobb és komplexebb C++ programmal lehet csak megoldani.
VFP-ODBC jellegzetessége:
- Nem kell külön definiálni, allokálni handler-eket
- Az eredmény mindig egy cursor (táblázat) struktúrába kerül, melyet közvetlenül el lehet érni a program további részében [VFP tudja kezelni a táblákat]
- Eltérő függvény azonosítók
- Egy kapcsolat egyidejűleg csak egy utasítást adhat ki
VFP-ODBL függvényei
SQLCancel(hdbc): abortálja a kapc
1-el tér vissza, ha sikeres
SQLColumns(hdbc,"tabla"): a megadott tábla szerkezetét leíró adatokat letárolja, áthozza egy cursor-ba (SQLRESOLT lesz a default neve)
SQLCommit (hdbc): tranzakció lezárás
hdbe=SQLConnect(DSN, felhasználónév, jelszó): kapcsolat kiépítés
SQLDisConnect(hdbc): kapcsolat megszakítás
SQLExec(hdbc,"SQL parancs",cursornev): parancs végrehajtás eredmény a SQLRESULT vagy a megadott cursorba kerül
SQLSETProp(hdbc,parameter,ertek): kapcsolat leírás paraméter beállítás
SQLGetProp(hdbe,parmeter): kapcsolat leíró paraméter lekérdezés
SQLRollback(hdbc): tranzakció visszajelzése
SQLTables(hdbc,táblatípus
VIEW
TABLE
SYSTEM_TABLE
Mintapélda:
handle = SQLConnect ("sysbaseminta","dba","sql")
if handle > 0
rc = SQLExec(handler,"select * from auto")
if rc>0
browse last
else
wait window ‘hiba’
endif
else
wait window ‘hibás kapcsolat’
endif
Open, standardized interface
The WEB servers can access the databases through CGI interface
Interfaces among the components:
1./4. WEB browser Û WEB server
HTML API
<FORM …. ACTION= URL>
….
</FROM>
2. WEB server Þ DBMS
CLI (usually SQL)
SQLEXEC(SQL-statement)
2. DBMS Þ WEB server
result written to standard output
HTP.PRINT(HTML-statement)