Bei ODBC (Open Database Connectivity) handelt es sich um eine standardisierte Datenbankschnittstelle, die SQL als Datenbanksprache verwendet. Somit bietet ODBC dem Programmierer eine Programmschnittstelle, welche es ihm erlaubt einen unkomplizierten Zugriff auf sehr unterschiedliche Datenbank-Verwaltungssysteme zu erhalten. Welche SQL-Befehle unterstützt werden, hängt vom jeweiligen ODBC-Treiber ab. CONZEPT 16 stellt auch diese Schnittstelle bereit, die es ermöglicht auf die CONZEPT 16-Datenbank zuzugreifen. Ebenfalls ist der Zugriff auf andere Datenbankmanagementsysteme über deren Datenquellen mit den Befehlen für ODBC-Verbindungen möglich.
Um vom CONZEPT 16-Client aus externe Datenquellen ansprechen zu können, muss eine entsprechende Datenquelle beim ODBC-Datenquellen-Manager eingerichtet sein. Näheres zum Einrichten einer Datenquelle kann in der Online-Dokumentation nachgelesen werden.
ODBC-Schnittstelle öffnen:
Die ODBC-Schnittstelle wird mit der Anweisung OdbcOpen()
initialisiert. Durch diese Anweisung wird ein ODBC-Schnittstellen-Objekt OdbcApi
erzeugt. Dieses Objekt wird beim Verbinden mit einer Datenquelle benötigt. Es bleibt so lange erhalten, bis es mit dem Befehl OdbcClose()
geschlossen wird.
// Odbc-Schnittstelle wird geöffnet
tOdbcApi # OdbcOpen();
ODBC-Verbindung aufbauen:
Ausgehend vom ODBC-Schnittstellen-Objekt kann mit OdbcConnect()
bzw. OdbcConnectDriver()
ein ODBC-Verbindungs-Objekt erzeugt werden. Über die Eigenschaften dieses Objektes können verschiedene Informationen über den ODBC-Treiber und die verbundene Datenbank ermittelt und Abfragen definiert werden. Beispielsweise kann über die Eigenschaften spOdbcConCfcOdbcApi
und spOdbcConCfcOdbcSql
der Grad der ODBC-Konformität bzw. der unterstützte Sprachumfang der gewählten Datenquelle ermittelt werden. Erst durch den Aufruf von OdbcClose()
wird das Verbindungs-Objekt geschlossen.
// Ausgehend von OdbcApi wird eine Verbindung hergestellt
tOdbcCon # tOdbcApi->OdbcConnect('MyDatabase', // Name der Datenquelle
'MyUser', // Benuter (optional)
'MyPassword');// Kennwort (optional)
Katalog-Informationen und Abfragen:
Tabellen-Informationen ermitteln
Um Tabellen-Informationen zu ermitteln, muss mit OdbcCatalogTbl()
ein ODBC-Tabellen-Objekt initialisiert werden. Hierbei wird entweder die erste oder die angegebene Tabelle gelesen. Weitere Tabellen können mit OdbcFetch()
selektiert werden. Dieses Objekt bleibt erhalten, bis es selbst mit OdbcClose()
oder die Verbindung geschlossen wird.
// Ermitteln aller Tabellen einer Datenquelle:
tOdbcApi # OdbcOpen();
tOdbcCon # tOdbcApi->OdbcConnect('MyDatabase','MyUser','MyPassword');
tOdbcCatTbl # tOdbcCon->OdbcCatalogTbl();
while (tOdbcCatTbl->OdbcFetch() = _ErrOk)
{
tTblName # tOdbcCatTbl->spOdbcTblName;
...
}
// Schnittstellen schließen
tOdbcCatTbl->OdbcClose();
tOdbcCon->OdbcClose();
tOdbcApi->OdbcClose();
Spalten-Informationen ermitteln:
Unter Verwendung von OdbcCatalogClm()
wird das ODBC-Spalten-Objekt erstellt. Die Eigenschaften des Objektes beinhalten die Attribute einer Spalte. Hier können alle oder nur bestimmte Spalten einer Tabelle ermittelt werden. Mit der Anweisung OdbcFetch()
können die Spalten nacheinander gelesen werden. Das Objekt bleibt erhalten, bis die Verbindung zur Datenquelle getrennt oder das Objekt selbst mit OdbcClose()
geschlossen wird.
// Ermitteln aller Spalten einer Tabelle:
tOdbcApi # OdbcOpen();
tOdbcCon # tOdbcApi->OdbcConnect('MyDatabase','MyUser','MyPassword');
tOdbcCatClm # tOdbcCon->OdbcCatalogClm('Customer');
while (tOdbcCatClm->OdbcFetch() = _ErrOk)
{
tTblName # tOdbcCatClm->spOdbcClmTable;
tClmName # tOdbcCatClm->spOdbcClmName;
...
}
// Schnittstellen schließen
tOdbcCatClm->OdbcClose();
tOdbcCon->OdbcClose();
tOdbcApi->OdbcClose();
Abfragen definieren:
Das Statement-Objekt wird durch die Anweisung OdbcPrepare()
und OdbcExecuteDirect()
erzeugt. Wird die Anweisung OdbcPrepare()
verwendet, wird ein übergebenes SQL-Statement für die spätere Ausführung mit OdbcExecute()
vorbereitet. Im Gegensatz zu gewöhnlichen Statements, welche mit OdbcExecuteDirect()
ausgeführt werden, enthält es noch keine Parameterwerte, stattdessen werden Platzhalter (‘?’) übergeben. Nach der Ausführung der Anweisung kann nun die Ergebnismenge mit OdbcFetch()
ausgelesen werden. Das Statement-Objekt steht zur Verfügung, bis die Verbindung zur Datenquelle getrennt oder das Objekt mit OdbcClose()
geschlossen wird.
// ODBC-Statement wird zur Datenquelle geschickt und das Resultat wird
// ausgewertet
tOdbcApi # OdbcOpen();
tOdbcCon # tOdbcApi->OdbcConnect('MyDatabase','MyUser','MyPassword');
tOdbcStmt # tOdbcCon->OdbcExecuteDirect('SELECT * FROM Customer');
while (tOdbcStmt->OdbcFetch() = _ErrOk)
{
tOdbcStmt->OdbcClmData(1,tCustomerId);
tOdbcStmt->OdbcClmData(5,tCustomerName);
...
}
// Schnittstellen schließen
tOdbcCatStmt->OdbcClose();
tOdbcCon->OdbcClose();
tOdbcApi->OdbcClose();
Weitere Informationen zum Thema OdbcPrepare
finden Sie im Artikel:
Erweiterung von OdbcParamAdd
3 Antworten
Vielleicht ist es erwähnenswert, dass man nicht notwendigerweise eine ODBC-Quelle einrichten muss, um sich mit Hilfe der C16-ODBC-Api dorthin zu verbinden.
Der Befehl "OdbcConnectDriver" nimmt einen Connect-String entgegen, in dem alle nötigen Informationen übergeben werden können, z.B.: OdbcApi->OdbcConnectDriver(‘driver={SQL Server};server=SERVERINSTANZ;database=DB_NAME;uid=DB_USER;pwd=PASSWORD’).
@Th.Eichele
Der Grad der ODBC-Konformität gibt Informationen über den Funktionsumfangs des ODBC-Treibers wieder. Hier existieren drei verschiedene Varianten. Je nach Konformität wird eine andere SQL-Grammatik unterstützt. Die Konformitätsstufe für minimales SQL enthält die notwendigsten Dinge zum Schreiben von ODBC-Anwendungen. Hier sind nur einfache SQL-Konstrukte erlaubt.
Beispielsweise einfache CREATE- und DROP TABLE-Anweisungen, einfache SELECT-, INSERT, UPDATE- und DELETE-Anweisungen oder Zeichen-Datentypen (CHAR, VARCHAR, LONG VARCHAR)
Die Konformitätsstufe Level 1 beinhaltet alle Funktionen des minimalen SQL und zusätzlich mehr Funktionalität beim Erzeugen und Verwalten von Tabellen (z.B. ALTER TABLE), volle SELECT-Funktionalität (z.B. SUM, MAX) und mehr Datentypen (z.B. DECIMAL, NUMERIC).
Die Konformitätsstufe Level 2 beinhaltet alle Funktionen der Konformiätsstufe 1 und ebenfalls zusätzlich weitere Befehle zur Datenmanipulation (z.B. positioniertes UPDATE), skalare Funktionen (z.B. SUBSTRING) und weitere Datentypen (z.B. BIT, BIGINT).
was besagt der "Grad der ODBC-Konformität" bzw. der "unterstützte Sprachumfang" genau ?
gibt es hier weitergehende Info zum verfügbaren Befehlsumfang oder ist hier jeweils Try and Error angesagt ?