Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Adatbázis rendszerek II
Kovács László Az SQL-CLI és ODBC környezet
2
SQL-CLI Az SQL parancsok 80%-át gazdanyelvből adják ki
1992: erős igény egy új SQL API-ra E-SQL: elüt a gazdanyelvtől alapvetően statikus egyetlen kapcsolatra épül adatbázis függő (előfordító) új SQL API: gazdanyelvhez illeszkedik dinamikus több párhuzamos kapcsolat adatbázis független ISO SQL Access Group
3
SQL-CLI ISO-SQL-CLI(ODBC):
- a gazdanyelv függvényeihez simul, az SQL parancsok paraméterként mennek át a DBMS-hez - nincs előfordító - leíró struktúrákat használ egy-egy kapcsolathoz - az API függvény könyvtár réteges felépítésű is lehet gazdanyelvi program scanf(”%d”,&n); SQLExec(kapcs,”UPDATE dolgozo SET fiz=0”) … DBMS SQL-CLI Library DBMS API Library
4
SQL-CLI szoros kapcsolat egymásra hatás SQL-CLI: ISO szabvány
ODBC: az MS CLI implementációja Az API felületet definiálja Az API működési logikát értelmezi Implementáció kétrétegű library adatbázis függetlenség PHP C VFP VB Delphi … ODBC Oracle MSServer DB2 VFP Excel …
5
SQL-CLI ODBC struktúrája kliens alkalmazás (ODBC API hívások)
ODBC vezérlő (meghajtók és kapcsolatok felügyelete ODBC meghajtó (hívások, parancsok konvertálása, kapcsolat tartás) adatforrás (relációs, táblázatkezelő,...)
6
SQL-CLI CLI-API elemek a kapcsolat, parancs leíró struktúrát
handler-nek nevezik A handlerek létrehozása után adhatók ki a függvényhívások párhuzamosan több handler és kapcsolat élhet handler-ek létrehozása handler-ek lezárása
7
SQL-CLI CLI-API elemek A parancsok végrehajtásához is több API hívás
kapcsolódik Lehet egylépcsős és kétlépcsős végrehajtás A CURSOR koncepcióra épül Az eredmény közvetlenül is lekérdezhető, vagy változóba irányítható A parancsok paraméterezhetőek
8
KÉP Thom Evans (?): Repetition
9
SQL-CLI session h. connection h. connection h. command h. command h.
Handlerek típusai session h. connection h. connection h. command h. command h. command h. A handlerek feladatai: - azonosítás - aktuális állapotot tárolása - aktuális parancs leírása - státusz tárolása A parancsokban a handlereket adjuk meg azonosítóként
10
SQL-CLI Handlerek kezelése Session handler: a kliens azonosítás
Connecton handler: adatforrás kapcsolat azonosítás Statement handler: parancs azonosítás e = sqlAllocEnv() c = sqlAllocConnect(e) p = sqlAllocStmt(c) sqlFreeStmt(p) sqlFreeConnect(c) sqlFreeEnv(e) handler-ek létrehozása handler-ek felszabadítása
11
SQL-CLI Adatbázis kapcsolat kezelése
DBMS kapcsolódásnál név/jelszó azonosítás is élhet: SQLConnect(c_h, server, user, password); DBMS kapcsolat bontás: SQLDisConnect(c_h, server, user, password); session transaction transaction Explicit tranzakció nyitás: SQLStartTran(h_type,handl, acc_mode, isol_lev); Tranzakció lezárás: SQLEndTran(h_type,handl, mode);
12
SQL-CLI SQL parancs kiadása kód SQL-parancs QEP cache QEP
Parancs végrehajtási módok: - közvetlen - kétlépcsős (paraméterezhető)
13
SQL-CLI Közvetlen SQL parancs kiadása SQLExecDirect (s_h,parancs)
egyszeri Kétlépcsős SQL parancs kiadása SQLPrepare (s_h, parancs) ismétlődő SQLExecute (s_h) SQLPrepare QEP kód Alkalmazás SQLExecute program
14
DBMS Alkalmazás kurzor SQL-CLI Eredmény adatok feldolgozása
A kurzor mechanizmusra épül DBMS Alkalmazás kurzor Ugrás a következő rekordra: SQLFetch (c_h) Mező értékek átvétele: SQLGetData (s_h, mező_sz, típus,...)
15
SQL-CLI Információ lekérés: SQLTables() SQLGetEnvAttr() AB
SQLGetStmtAttr() SQLGetInfo() ... Alkalmazás Paraméter beállítás: AB SQLSetEnvAttr() SQLSetStmtAtt ... Alkalmazás Hiba észlelése: 1. API függvény visszatérési értéke 2. SQLError(e_h, c_h,s_h,sqlstate,message,… )
16
SQL-CLI
17
SQL-ODBC ODBC struktúra Lehet egyszintű és kétszintű meghajtó DSN:
data source name (adatforrás azonosító) Gazdanyelv függő API Működési paraméterek: - izolációs szint - tranzakció szint - timeout - adat konverziók
18
SQL-ODBC ODBC Driver 1 Driver manager Driver 1 Driver 1
meghajtók kezelése kapcsolat az alkalmazással hibakezelés memória kezelés elemi konverziók információ nyújtás parancs konverzió adat konverzió kapcsolat felvétel funkció bővítés hibakezelés információ nyújtás
19
SQL-ODBC SQLAllocEnv(&henv); //session létesítés
SQLAllocConnect(henv,&hdbc); //kapcsolat leíró foglalás SQLConnect(hdbc,(unsigned char*) // kapcsolódás ”HELLO”,SQL_NTS,NULL,0, NULL,0); 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 ciklusban SQLGetData(hstmt,1,SQL_C_CHAR,SzData, Sizeof(sydata),&cbData); //mező lekérdezése 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ó
20
automatikus konverzió
SQL-CLI Gazdanyelvi változók kötése DB Alkalmazás adatcsere mező változó Fontos a konzisztens értelmezés (koccintás, villogás, bólintás,…) Értelmezés leíró struktúrákra van szükség mező név típus hossz cím ... változó név típus hossz cím ... automatikus konverzió
21
SQL-CLI Értelmezés leíró struktúrák Command Handler IPD APD DB
Alkalmazás IRD ARD A leíró struktúrák feltöltése: - manuális - automatikus
22
SQL-CLI Közvetlen kezelés, paraméterezett SQL parancs
int skod = 0; // kapcsolati változó SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, &henv); SQLAllocHandle(SQL_HANDLE_DBC,henv, &hdbc); SQLAllocStmt(hdbc1, &hstmt); // handlerek allokálása SQLCHAR parancs = ”UPDATE dolg SET fiz=fiz*0.5 WHERE kod=? ”; // parancs szöveg, a ? Jel jelöli a paramétert if (SQLPrepare (hstmt,parancs,SQL_NTS) != SQL_SUCCESS) {…} // parancs előkészítése SQLGetStmtAttr(hstmt, SQL_ATTR_APP_PARAM_DESC, &hdesc1,…); // APD struktúra címének lekérdezése SQLSetDescRec(hdesc1, ..., SQL_INTEGER, &skod,…); // APD paraméterek beállítása SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hdesc2,…); // IPD struktúra címének lekérdezése SQLSetDescRec(hdesc2,..., SQL_INTEGER, 1,…); // IPD mezőinek beállítása
23
folytatás ... … scanf(„%d”, &skod); // változó értékadása if (SQLExecute(hstmt) != SQL_SUCCESS) {…} // parancs végrehajtás SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT); // tranzakció lezárás SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); // handlerek felszabadítása
24
SQL-CLI Közvetett kezelés, paraméterezett SQL parancs …
char snev[100]; // gazdanyelvi változók int sfiz,skod = 0; SQLCHAR parancs = ”UPDATE dolg SET fiz=fiz*0.5 WHERE kod=? ”; if (SQLPrepare (hstmt,parancs,SQL_NTS) != SQL_SUCCESS) {…} // parancs előkészítés if (SQLBindParameter(hstmt,…,SQL_INTEGER, &skod,…) != SQL_SUCCES ) {…} // input paraméterek kötése scanf(„%d”, &skod); if (SQLExecute(hstmt) != SQL_SUCCESS) {…} // végrehajtás if (SQLExecDirect(hstmt,”SELECT nev, fiz FROM dolg”,SQL_NTS) != SQL_SUCCES ) {…} // lekérdezés végrehajtás if (SQLBindCol(hstmt,…,1,SQL_CHAR,snev,…) != SQL_SUCCES){…} // eredmény mezők kötése while (SQLFetch(hstmt == SQL_SUCCESS) { sfiz = SQLGetData(hstmt,1,SQL_INTEGER,…); // direkt olv printf (”%s = %d\n”, snev, sfiz); // indirekt olv. } // beolvasási ciklus
25
ODBC / SQL-CLI / DB2-CLI Adatkapcsolati függvények
SQLAllocConnect() Depr V 1.1 SQLAllocEnv() Depr V 1.1 SQLAllocHandle() Core V 5 SQLBrowseConnect() Level V 5 SQLConnect() Core V 1.1 SQLDriverConnect() Core SQL3 V 2.1 SQLDrivers() Core No No SQLSetConnectAttr() Core V 5 SQLSetConnectOption() Depr V 2.1 SQLSetConnection() No SQL3 V 2.1
26
ODBC / SQL-CLI / DB2-CLI Parancs előkészítési függvények
SQLAllocStmt() Depr V 1.1 SQLPrepare() Core V 1.1 SQLExtendedPrepare() No No V 6 SQLExtendedBind() No No V 6 SQLBindParameter() Lvl V 2.1 SQLSetParam() Depr No V 1.1 SQLParamOptions() Depr No V 2.1 SQLGetCursorName() Core V 1.1 SQLSetCursorName() Core V 1.1 Kapcsolat lezárás SQLDisconnect() Core V 1.1 SQLEndTran() Core V 5 SQLFreeConnect() Depr V 1.1 SQLFreeEnv() Depr V 1.1
27
ODBC / SQL-CLI / DB2-CLI Parancs elküldési függvények
SQLDescribeParam() Level 2 SQL3 V 5 SQLExecute() Core V 1.1 SQLExecDirect() Core V 1.1 SQLNativeSql() Lvl V 2.1 SQLNumParams() Lvl V 2.1 SQLParamData() Lvl V 2.1 SQLPutData() Core V 2.1 Felszabadítás SQLFreeHandle() Core V 1.1 SQLFreeStmt() Core V 1.1 SQLCancel() Core V 1.1 SQLCloseCursor() Core V 5
28
ODBC / SQL-CLI / DB2-CLI Eredmény lekérdezése ODBC SQL-CLI DB2-CL
SQLRowCount() Core V 1.1 SQLDescribeCol() Core V 1.1 SQLColAttribute() Core Yes V 5 SQLColAttributes() Depr Yes V 1.1 SQLColumnPrivileges() Lev V 2.1 SQLSetColAttributes() No No V 2.1 SQLBindCol() Core V 1.1 SQLFetch() Core V 1.1 SQLFetchScroll() Core V 5 SQLExtendedFetch() Depr V 2.1 SQLGetData() Core V 1.1 SQLMoreResults() Lvl 1 SQL3 V 2.1 SQLNextResult() No Yes V7.1 SQLError() Depr V 1.1 SQLGetDiagField() Core V 5 SQLGetDiagRec() Core V 5 SQLSetPos() Level 1 SQL3 V 5 SQLGetSQLCA() No No V 2.1
29
ODBC / SQL-CLI / DB2-CLI Információ lekérdezése ODBC SQL-CLI DB2-CL
SQLColumns() Lvl 1 SQL3 V 2.1 SQLForeignKeys() Lvl 2 SQL3 V 2.1 SQLPrimaryKeys() Lvl 1 SQL3 V 2.1 SQLProcedureColumns() Lvl 2 No V 2.1 SQLProcedures() Lvl 2 No V 2.1 SQLSpecialColumns() Core SQL3 V 2.1 SQLStatistics() Core SQL3 V 2.1 SQLTablePrivileges() Lvl 2 SQL3 V 2.1 SQLTables() Core SQL3 V 2.1
30
PHP-ODBC odbc_connect() : adatbázis kapcsolódás
odbc_exec() : közvetlen parancsvégrehajtás odbc_prepare() : előkészítés odbc_execute() : előkészített parancs végrehajtás odbc_fetch_row(): rekord beolvasás odbc_result() : egy mező átvétele az eredményből odbc_close() : kapcsolat zárása odbc_commit() : véglegesítés odbc_rollback() : visszagörgetés odbc_num_rows() : rekordok száma odbc_tables() : táblák adatai odbc_columns() : mezők adatai odbc_error() : hibakód odbc_fetch_array() : eredmény rekord átvétele tömbbe odbc_num_fields() : mezők darabszáma odbc_field_name() : mező neve odbc_set_options() : kapcsolati paraméter beállítás
31
PHP-ODBC <html> <body> <?php
$conn=odbc_connect('northwind','',''); if (!$conn) {exit("Connection Failed: " . $conn);} $sql="SELECT * FROM customers"; $rs=odbc_exec($conn,$sql); if (!$rs) {exit("Error in SQL");} echo "<table><tr>"; echo "<th>Companyname</th>"; echo "<th>Contactname</th></tr>"; while (odbc_fetch_row($rs)) { $compname=odbc_result($rs,"CompanyName"); $conname=odbc_result($rs,"ContactName"); echo "<tr><td>$compname</td>"; echo "<td>$conname</td></tr>"; } odbc_close($conn); echo "</table>"; ?> </body> </html>
32
VFP-ODBC egyszerűsített nyilvántartás
- egy leíró struktúra (egész típusú azonosító) egyszerűsített adatkezelés - VFP lokális kurzorba tölti át az eredményt hdbe=SQLConnect(DSN, felhasználó, jelszó) SQLExec(hdbc,”SQL”,cursornev) SQLColumns(hdbc,”tabla”) SQLCommit (hdbc) SQLTables(hdbc) SQLSETProp(hdbc,parameter,ertek) SQLGetProp(hdbe,parmeter) SQLRollback(hdbc) SQLDisConnect(hdbc)
33
VFP-ODBC pw = allt(thisform.jszo.value)
con = sqlconnect("LocalServer","ujabb",pw) if con < 0 …… endif p = sqlexec(con,"SELECT max(kod) db FROM dolg","cu1") if p > 0 select cu1 kod = cu1.db + 1 endif p = sqlexec(con,"INSERT INTO DOLG VALUES(" + allt(str(kod))+ ",'" + allt(thisform.nev.value)+"') ")
34
kép Thom Evans: Whispers
35
Adatkezelés speciális elemei
ODBC szintek ODBC kurzor módok CLI APD/IPD leíró területek CLI ARD/IRD leíró terület API: getDesc/SetDesc API : kötések (Binding) Deffered parameters Környezet beállítások
36
Thom Evans: My new hat
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.