Open Database Connectivity (ODBC)
Idee:
– API für eine DBMS, das ein Call-Level-Interface für die Ausführung von SQL-Befehlen darstellt
Vergleiche SQL/CLI
– Bestandteil des SQL:1999 Standard
– Angleichung mit ODBC geplant
Software-Architektur vergleichbar wie JDBC
– Driver Manager und Driver für jedes angeschlossene DBMS
– ODBC nicht objektorientiert, DBMS-Interface auf niedrigerem Level
– Gefahr von Memory Leaks
Programmstruktur
SQLAllocEnv (&henv);
SQLAllocConnect (henv,&hdbc);
SQLConnect(hdbc,database_name,userId,password) SQLAllocStmt (hdbc,&hstmt);
SQLExecDirect (hstmt, ... SQL statement ... );
.
. verarbeite Ergebnisse .
SQLFreeStmt (hstmt,fOption);
SQLDisconnect (hdbc);
SQLFreeConnect (hdbc);
SQLFreeEnv (henv);
ODBC Funktionen
SQLAllocEnv()
– allokiert und initialisiert Speicher für eine Environment Area, genutzt vom Driver Manager für Run-Time Informationen
– liefert einen Handle zurück (in C: Pointer)
SQLAllocConnect()
– allokiert Speicher für die Connection und liefert einen Connection Handle zurück, hdbc
SQLConnect()
– lädt DB-Driver und verbindet sich mit dem DB-Server
– auch mehrere Verbindungen zu DB-Managern möglich
SQLAllocStmt()
– allokiert Speicher innerhalb des Drivers für ein SQL Statement und liefert einen Handle, hstmt, für dieses Statement zurück
ODBC Funktionen (Forts.)
SQLExecDirect()
– bekommt einen Statement Handle und eine String-Variable für das eigentliche Statement
– veranlaßt Prepare und Execute für das Statement im Server
– Retrieval (SELECT), DML (UPDATE) und DDL-Befehle (CREATE) möglich
– produziert ein Resultset, auf das durch Cursor zugegriffen werden kann
SQLDisconnect()
– löst Verbindung zum Server
SQLFreeStmt(),SQLFreeConnect(),SQLFreeEnv()
– Freigabe der Handle und des allokierten Speichers
Prepared Statements
Prepare Statement
SQLPrepare (hstmt, ... SQL statement ...);
kann Platzhalter ? beinhalten
Execute Statement
SQLExecute (hstmt);
Bereitstellen von Parametern an dynamisches SQL- Statement
SQLBindParameters (hstmt,1,SQL_PARAMETER_INPUT, SQL_C_SSHORT,SQL_SMALLINT,&int1);
Cursor
Daten werden über Cursor zurückgegeben
zusätzliche ODBC Funktionen, um Daten in Applikation zu bringen
SQLBindCol (hstmt,1,SQL_C_SSHORT,&int2);
bindet erste Spalte des ResultSet an Variable int2 SQLFetch (hstmt);
Cursor wird weitergesetzt, Werte der aktuellen Zeile werden in Host-Variablen gespeichert
wenn Variable nicht gebunden:
SQLGetData (hstmt,2,SQL_C_SSHORT,&int3);
Cursor Typen
STATIC
– bei Ausführung von SELECT Berechnung des ResultSet, separat von Basistabelle abgespeichert
– Aufruf von SQLFetch holt eine Zeile vom ResultSet
KEYSET_DRIVEN
– bei Ausführung von SELECT wird Menge von Pointern auf Zeile der Basistabelle angelegt
– Aufruf von SQLFetch folgt Pointer und holt Zeilen von Basistabelle
– Änderungen in Basistabelle beim nächsten Fetch sichtbar
– neue Datensätze nicht sichtbar (Insert-Anomalie)
DYNAMIC
Cursor-Verarbeitung
Setzen des Cursor-Typs:
SQLSetStmtOption (hstmt,SQL_CURSOR_TYPE,Option)
positionierte Updates durch nicht-statische Cursor
SQLExecDirect (hstmt1,“SELECT * FROM Employee \ FOR UPDATE OF Salary“);
nach einigen Fetch-Statements, Erhöhung des Gehalts um 1000 im aktuellen Datensatz
SQLExecDirect (hstmt2,“UPDATE Employee SET Salary = Salary + 1000 \
WHERE CURRENT OF employee_cursor“);
Verbindung des employee_cursor mit dem Statement Handle SQLSetCursor (hstmt1,employee_cursor);
Statusabfrage
Statusabfrage
RETCODE retcode1;
:
retcode1 = SQLConnect(...);
if (retcode != SQL_SUCCESS) { : do something
}
Ausführung von Transaktionen
Autocommit-Modus
– ausschalten, wenn zwei oder mehr Statements zu Transaktion gruppiert werden sollen
SQLSetConnection (hdbc,SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
Isolation Level ändern
SQLSetConnectionOption (hdbc, SQL_TXN_ISOLATION,
SQL_TXN_REPEATABLE_READ);
Transaktionen beenden oder zurückrollen
SQLTransact (henv,hdbc,Action) Action = SQL_COMMIT oder SQL_ABORT