Hauptaufgabe: Abbildung der unterschiedlichen Datenmodelle und Zugriffsparadigmen zwischen Programmiersprache und dem DBMS, z.b. C++ Basisdatentypen und flexible Typkonstruktoren wie Strukturen und Klassen Basisdatentypen entsprechend C++ Standard Imperative Programmiersprache (wie wird das Ergebnis berechnet) SQL Tabellen (Multimengen/Listen) von Zeilen mit Attributwerten von Basisdatentypen Plattform- und Programmiersprachen unabhängige Basisdatentypen Deklarative Anfragesprache (was soll das Ergebnis sein) Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 80
Aufgaben von Programmierschnittstellen Kapselung der Datenbankfunktionalität durch geeignete Funktionen/Strukturen/Klassen für Verbindung zum DBMS Zugriff auf Konkrete Datenbank Absetzen von Anfragen Zugriff auf Ergebnisse Geeignete Datenstrukturen für mengenwertige Anfrageergebnisse Zugriff über imperative Programmiersprache Cursor- oder Iterator-Konzept zum zeilenweisen Auslesen der Ergebnisse Zugriff auf Metadaten (Beschreibung von Tabellen und Anfrageergebnissen, z.b. welche Spalten hat das gerade übertragene Ergebnis) Umgesetzt als Bibliotheken, die auf Treiber (optional) und Protokoll zur Kommunikation mit DBMS Server abbilden Anwendung Schnittstelle Treiber DBMS DB Client Server Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 81
Programmierschnittstellen engl. Application Programming Interface (API) Zahlreiche verschiedene Schnittstellen existieren Unterscheidung nach verschiedenen Kriterien möglich Abstraktionsstufe: Low-level (Absetzen von Anfragen, generische Ergebnistypen) bis High-level (z.b. definierte/definierbare Abbildung auf Anwendungsobjekte) Abhängigkeit oder Unabhängigkeit von Programmiersprache Hardware-/Betriebssystemplattform konkretem DBMS Im folgenden 2 Beispiele: ODBC und proprietäre MySQL Anbindung Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 82
ODBC Open Database Connectivity Low-level: Aufbau von Verbindungen, Absetzen von Anfragen, Lesen generischer Ergebnisse) Unabhängig von Programmiersprache: Schnittstelle bestehend aus Funktionen mit Handles (Strukturen) zur Verwaltung der Zustandsinformationen Unabhängig von Hardware und Betriebssystem: ursprünglich Umsetzung des CLI-Standards (Call Level Interface) für Microsoft Windows, mittlerweile aber auf vielen Plattformen Unabhängig vom verwendeten DBMS: Treiber für fast alle kommerziellen DBMS verfügbar Extrem flexibel, dafür aber nicht sehr einfach in der Handhabung siehe folgendes Beispielprogramm zum Auslesen der Tabelle Studenten Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 83
ODBC Beispiel Aufbau einer Datenbankverbindung und komplettes Lesen der Student-Tabelle Code auf der Web-Seite zur Vorlesung Übersetzung und Ausführung des Beispiels erfordern Installiertes MySQL DBMS Beispieldatenbank entsprechend Script auf Web-Seite zur Vorlesung Installierten MySQL ODBC Treiber Konfiguration der MySQL Datenbank als ODBC-Quelle Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 84
ODBC Beispiel /1 #include <windows.h> #include <sql.h> #include <sqlext.h> #include <sqltypes.h> #include <iostream> using namespace std; int main() { SQLHENV sql_henv = 0; SQLHDBC sql_hdbc = 0; SQLHSTMT sql_hstmt = 0; SQLSMALLINT nsize = 0; SQLRETURN sqlret; Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 85
ODBC Beispiel /2 SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sql_henv ); SQLSetEnvAttr( sql_henv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, 0 ); SQLAllocHandle(SQL_HANDLE_DBC, sql_henv, &sql_hdbc ); sqlret = SQLConnect( sql_hdbc, (SQLCHAR*) gif, SQL_NTS, (SQLCHAR*), SQL_NTS, (SQLCHAR*), SQL_NTS ); Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 86
ODBC Beispiel /3 if (SQL_SUCCEEDED(sqlRet)) { sqlret = SQLAllocHandle( SQL_HANDLE_STMT, sql_hdbc, &sql_hstmt ); sqlret = SQLExecDirect( sql_hstmt, (SQLCHAR*) SELECT * FROM gif.student;, SQL_NTS ); SQLSMALLINT ncols = 0; SQLINTEGER nrows = 0; SQLINTEGER nidicator = 0; SQLCHAR buf[1024] = {0}; SQLNumResultCols( sql_hstmt, &ncols ); SQLRowCount( sql_hstmt, &nrows ); Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 87
ODBC Beispiel /4 while(sql_succeeded(sqlret = SQLFetch(sql_hStmt))) { cout << Student: ; for (int i=1; i <= ncols; ++i ) { sqlret = SQLGetData( sql_hstmt, i, SQL_C_CHAR, buf, 1024, &nidicator ); if (SQL_SUCCEEDED( sqlret )) { cout << buf; } if (i==ncols) cout << endl; else cout <<, ; } } Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 88
ODBC Beispiel /5 } SQLFreeHandle( SQL_HANDLE_STMT, sql_hstmt ); SQLDisconnect( sql_hdbc ); } else { cout << Fehler bei der Verbindung zur Datenbank! << endl; } SQLFreeHandle( SQL_HANDLE_DBC, sql_hdbc ); SQLFreeHandle( SQL_HANDLE_ENV, sql_henv ); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 89
MySQL Connector/C++ Proprietäre Schnittstelle für MySQL DBMS Low-level Nur für C++: objektorientierte Schnittstelle mit Klassen und Methoden, aber angelehnt an JDBC (Industriestandard für Datenbankzugriffe in Programmiersprache Java) und ähnliche zu MySQL Connector-Implementierungen für andere Programmiersprachen Unabhängig von Hardware und Betriebssystem: Bibliothek für zahlreiche Plattformen verfügbar Abhängig vom verwendeten DBMS: funktioniert nur mit MySQL Vergleichsweise einfache und intuitive Nutzung Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 90
MySQL Beispiel Aufbau einer Datenbankverbindung und Lesen von 2 Spalten der Student-Tabelle Code auf der Web-Seite zur Vorlesung Übersetzung und Ausführung des Beispiels erfordern Installiertes MySQL DBMS Beispieldatenbank entsprechend Script auf Web-Seite zur Vorlesung Installierten MySQL Connector/C++ Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 91
MySQL Beispiel /1 #include <stdlib.h> #include <iostream> #include mysql_connection.h #include <cppconn/driver.h> #include <cppconn/exception.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> using namespace std; int main() { try { sql::driver *driver; sql::connection *con; sql::statement *stmt; sql::resultset *res; Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 92
MySQL Beispiel /2 driver = get_driver_instance(); con = driver->connect(,, ); con->setschema( gif ); stmt = con->createstatement(); res = stmt->executequery( SELECT * FROM student ); while (res->next()) { cout << res->getstring( name ) <<, ; cout << res->getstring( vorname ) << endl; } Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 93
MySQL Beispiel /3 delete res; delete stmt; delete con; } catch (sql::sqlexception &e) { cout << ERROR: << e.what(); cout << MySQL error code: << e.geterrorcode() << endl; } } cout << endl; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 94
Transaktionen Transaktion: Folgen von Datenbankoperationen, die für die Ausführung als logische Einheit betrachtet werden Transaktion: Überweisung(X, Y, Betrag) Checke Konto X: SELECT X = X - Betrag: UPDATE Checke Konto Y: SELECT Y = Y + Betrag: UPDATE Erfolgreich beendet: Commit Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 95
ACID-Eigenschaften Transaktion müssen dem ACID-Prinzip entsprechend vom DBMS ausgegeführt werden: Atomicity (Atomarität): eine Transaktion muss als Einheit ausgeführt werden, d.h. entweder ganz oder gar nicht Consistency (Konsistenz): eine Transaktion muss die Datenbank immer von einem konsistenten Zustand in einen konsistenten Zustand überführen (auch wenn Zwischenzustände ggf. inkonsistent sein können) Isolation (Schutz bei Nebenläufigkeit): bei der zeitgleichen Ausführung von Transaktionen (z.b. durch mehrere Nutzer) dürfen in einer Transaktion keine Effekte paralleler, noch nicht abgeschlossener Transaktionen sichtbar sein Durability (Dauerhaftigkeit): wird eine Transaktion erfolgreich beendet, so kann der von ihr erzielte Effekt nicht nachträglich rückgängig gemacht werden Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 96
Beispiel: Problem Atomarität TXN: Überweisung Checke Konto X X = X - Betrag Checke Konto Y: Fehler: Konto gesperrt ABBRUCH Beenden der Transaktion Zurücksetzen aller zuvor gemachten Änderungen Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 97
Beispiel: Problem Isolation Parallele Ausführung zweier Transaktionen: TXN: Überweisung Checke Konto X X = X - Betrag TXN: Zinsen Lies Konto X Zinsen = X * Zinssatz X = X + Zinsen Inkonsistenter Zustand, der die Überweisung des Betrages überschreibt, muss durch DBMS vermieden werden Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 98
Umsetzung in SQL oder Programmiersprachen Möglichkeiten zum Start einer Transaktion SQL:START TRANSACTION Impliziter Transaktionsbeginn: spezieller Modus in vielen DBMS, der bei erstem Datenzugriff eine Transaktion beginnt, wleche bis zu explizitem Beenden (s.u.) läuft Transaktion pro Statement: spezieller Modus in vielen DBMS, der für jedes Statement (Anfrage, Update, etc.) eine einzelne Transaktion startet Erfolgreiches Beenden einer Transaktion SQL:COMMIT Abbruch einer Transaktion (mit Rücksetzen aller bisherigen Ergebnisse: SQL:ROLLBACK Programmierschnittstellen bieten oft eigene Schnittstellen (Funktionen, Transaktionsklassen) zur Steuerung von Transaktionen Eike Schallehn Grundlagen der Informatik für Ingenieure 2008/2009 6 99