Freigeben über


TN042: Empfehlungen für ODBC-Treiberentwickler

Hinweis

Die Microsoft Foundation Classes (MFC)-Bibliothek wird weiterhin unterstützt. Wir fügen jedoch keine Features mehr hinzu oder aktualisieren die Dokumentation.

Hinweis

Der folgende technische Hinweis wurde seit der ersten Aufnahme in die Onlinedokumentation nicht aktualisiert. Daher sind einige Prozeduren und Themen möglicherweise veraltet oder falsch. Für die neuesten Informationen empfiehlt es sich, nach dem interessanten Thema im Onlinedokumentationsindex zu suchen.

Diese Notiz beschreibt Richtlinien für Entwickler von ODBC-Treibern. Es beschreibt allgemeine Anforderungen und Annahmen von ODBC-Funktionen, die von den MFC-Datenbankklassen erstellt werden, und verschiedene erwartete semantische Details. Die erforderlichen Treiberfunktionen zur Unterstützung der drei CRecordset Open-Modi (forwardOnly, Snapshot und Dynaset) werden beschrieben.

Cursorbibliothek von ODBC

Die MFC-Datenbankklassen stellen dem Benutzer Funktionen zur Verfügung, die in vielen Fällen die Funktionalität der meisten ODBC-Treiber der Ebene 1 übertrifft. Glücklicherweise schichtet sich die Cursorbibliothek von ODBC automatisch zwischen die Datenbankklassen und den Treiber und bietet so einen Großteil dieser zusätzlichen Funktionalität.

Die meisten 1.0-Treiber unterstützen beispielsweise den Rückwärtslauf nicht. Die Cursorbibliothek kann dies erkennen und Zeilen vom Treiber zwischenspeichern und sie bei FETCH_PREV-Aufrufen nach Bedarf in SQLExtendedFetch präsentieren.

Ein weiteres wichtiges Beispiel für die Abhängigkeit der Cursorbibliothek sind positionierte Aktualisierungen. Die meisten 1.0-Treiber verfügen auch nicht über positionsbezogene Aktualisierungen, aber die Cursorbibliothek generiert Aktualisierungsanweisungen, die eine Zielzeile auf der Datenquelle basierend auf ihren aktuellen zwischengespeicherten Datenwerten oder einem zwischengespeicherten Zeitstempelwert identifizieren.

Die Klassenbibliothek verwendet niemals mehrere Rowsets. Daher werden die wenigen SQLSetPos Anweisungen immer auf Zeile 1 des Rowsets angewendet.

CDatabases

Jeder CDatabase weist einen einzelnen HDBC zu. (Wenn die Funktion CDatabase von ExecuteSQL verwendet wird, wird vorübergehend ein HSTMT belegt.) Wenn also mehrere CDatabase erforderlich sind, müssen mehrere HDBC pro HENV unterstützt werden.

Für die Datenbankklassen ist die Cursorbibliothek erforderlich. Dies spiegelt sich in einem SQLSetConnections Aufruf von SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC wider.

SQLDriverConnect, SQL_DRIVER_COMPLETE wird von CDatabase::Open verwendet, um die Verbindung mit der Datenquelle herzustellen.

Der Treiber muss = SQLGetInfo SQL_ODBC_API_CONFORMANCE, >= SQLGetInfo SQL_ODBC_SQL_CONFORMANCE unterstützen>.

Damit Transaktionen für die CDatabase und ihre abhängigen Datensätze unterstützt werden können,SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR muss SQL_CURSOR_ROLLBACK_BEHAVIOR SQL_CR_PRESERVE haben. Andernfalls werden Versuche zur Transaktionssteuerung ignoriert.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY muss unterstützt werden. Wenn "Y" zurückgegeben wird, werden keine Aktualisierungsvorgänge für die Datenquelle ausgeführt.

Wenn ReadOnly geöffnet CDatabase wird, wird mit SQL_MODE_read_only versuchtSQLSetConnectOption SQL_ACCESS_MODE, die Datenquelle SCHREIBGESCHÜTZT zu setzen.

Wenn Kennungen zitiert werden müssen, sollten diese Informationen mit einem SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR Anruf vom Fahrer zurückgegeben werden.

Für Debuggingzwecke SQLGetInfo SQL_DBMS_VER und SQL_DBMS_NAME werden vom Treiber abgerufen.

SQLSetStmtOption SQL_QUERY_TIMEOUT und SQL_ASYNC_ENABLE können auf einem CDatabaseHDBC angerufen werden.

SQLError kann mit einem oder allen Argumenten NULL aufgerufen werden.

Natürlich müssen SQLAllocEnv, SQLAllocConnect, SQLDisconnect und SQLFreeConnect unterstützt werden.

ExecuteSQL

Zusätzlich zum Zuweisen und Freigeben eines temporären HSTMT, ruft ExecuteSQLSQLExecDirect, SQLFetch, SQLNumResultCol und SQLMoreResults auf. SQLCancel kann auf der HSTMT aufgerufen werden.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME aufgerufen werden.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMIT und SQLTransact SQL_COMMIT, SQL_ROLLBACK und SQL_AUTOCOMMIT werden aufgerufen, wenn Transaktionsanforderungen gestellt werden.

CRecordsets

SQLAllocStmt, SQLPrepare( SQLExecute Für Open und Requery), SQLExecDirect (für Aktualisierungsvorgänge) SQLFreeStmt muss unterstützt werden. SQLNumResultCols und SQLDescribeCol wird zu verschiedenen Zeiten über die eingestellten Ergebnisse abgerufen.

SQLSetParam wird umfassend für Bindungsparameterdaten und DATA_AT_EXEC Funktionalität verwendet.

SQLBindCol wird umfassend verwendet, um Ausgabespeicherorte für Spaltendaten mit ODBC zu registrieren.

Zum Abrufen SQLGetData und SQL_LONG_VARBINARY Daten werden zwei Aufrufe verwendet. Der erste Aufruf versucht, die Gesamtlänge des Spaltenwerts zu ermitteln, indem SQLGetData mit cbMaxValue von 0, aber mit einem gültigen PcbValue aufgerufen wird. Wenn pcbValue SQL_NO_TOTAL hält, wird eine Ausnahme ausgelöst. Andernfalls wird ein HGLOBAL zugewiesen und ein weiterer SQLGetData Aufruf durchgeführt, um das gesamte Ergebnis abzurufen.

Wird aktualisiert

Wenn pessimistisches Sperren angefordert wird, SQLGetInfo SQL_LOCK_TYPES wird abgefragt. Wenn SQL_LCK_EXCLUSIVE nicht unterstützt wird, wird eine Ausnahme ausgelöst.

Versuche, eine CRecordset (Momentaufnahme oder Dynaset) zu aktualisieren, führen dazu, dass ein zweites HSTMT zugewiesen wird. Bei Treibern, die das zweite HSTMT nicht unterstützen, simuliert die Cursorbibliothek diese Funktionalität. Leider kann dies manchmal bedeuten, dass die aktuelle Abfrage des ersten HSTMT zur Erfüllung gezwungen wird, bevor die Anfrage des zweiten HSTMT bearbeitet wird.

SQLFreeStmt SQL_CLOSE und SQL_RESET_PARAMS und SQLGetCursorName werden während aktualisierungsvorgängen aufgerufen.

Wenn CLongBinarys in den outputColumns vorhanden sind, muss die DATA_AT_EXEC-Funktionalität von ODBC unterstützt werden. Dies umfasst die Rückgabe von SQL_NEED_DATA von SQLExecDirect, SQLParamData und SQLPutData.

SQLRowCount wird nach der Ausführung aufgerufen, um zu überprüfen, ob nur 1 Datensatz durch SQLExecDirect aktualisiert wurde.

Nur Weiterleitungs-Cursor

Nur SQLFetch ist für die Move Operationen erforderlich. Beachten Sie, dass forwardOnly-Cursor keine Updates unterstützen.

Momentaufnahmen-Cursor

Snapshot-Funktionalität erfordert SQLExtendedFetch Unterstützung. Wie bereits erwähnt, erkennt die ODBC-Cursorbibliothek, wenn ein Treiber nicht unterstützt wirdSQLExtendedFetch, und bietet selbst die erforderliche Unterstützung.

SQLGetInfo, SQL_SCROLL_OPTIONS muss SQL_SO_STATIC unterstützen.

Dynaset-Cursoren

Nachfolgend finden Sie die Mindestunterstützung, die zum Öffnen eines dynaset erforderlich ist:

SQLGetInfo, SQL_ODBC_VER muss "01" zurückgeben > .

SQLGetInfo SQL_SCROLL_OPTIONS muss SQL_SO_KEYSET_DRIVEN unterstützen.

SQLGetInfo, SQL_ROW_UPDATES muss "Y" zurückgeben.

SQLGetInfo, SQL_POSITIONED_UPDATES muss SQL_PS_POSITIONED_DELETE und SQL_PS_POSITIONED_UPDATE unterstützen.

Wenn außerdem eine pessimistische Sperre angefordert wird, wird SQLSetPos mit irow 1, fRefresh FALSE und fLock SQL_LCK_EXCLUSIVE aufgerufen.

Siehe auch

Technische Hinweise nach Nummer
Technische Hinweise nach Kategorie