Share via


TN042: Empfehlungen für ODBC-Treiberentwickler

Hinweis

Der folgende technische Hinweis wurde seit dem ersten Erscheinen in der Onlinedokumentation nicht aktualisiert. Daher können einige Verfahren und Themen veraltet oder falsch sein. Um aktuelle Informationen zu erhalten, wird empfohlen, das gewünschte Thema im Index der Onlinedokumentation zu suchen.

Dieser Hinweis beschreibt Richtlinien für ODBC-Treiberautoren. 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, Momentaufnahme 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 übergibt sich die Cursorbibliothek von ODBC zwischen den Datenbankklassen und dem Treiber und stellt automatisch einen Großteil dieser zusätzlichen Funktionalität bereit.

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 SQLExtendedFetchBedarf präsentieren.

Ein weiteres wichtiges Beispiel für die Abhängigkeit von Cursorbibliotheken sind 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 CDatabasedie ExecuteSQL Funktion verwendet wird, wird vorübergehend ein HSTMT zugewiesen.) Wenn also mehrere CDatabase's erforderlich sind, müssen mehrere HDBC-Spro HENV unterstützt werden.

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

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

Der Treiber muss = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM unterstützenSQLGetInfo SQL_ODBC_API_CONFORMANCE>.

Damit Transaktionen für die CDatabase und ihre abhängigen Recordsets unterstützt werden können, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR und SQL_CURSOR_ROLLBACK_BEHAVIOR über SQL_CR_PRESERVE verfügen müssen. 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 CDatabase geöffnet wird, wird versucht, die Datenquelle schreibgeschützt mit SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Wenn Bezeichner eine Quotierung erfordern, sollten diese Informationen vom Treiber mit einem SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR Anruf zurückgegeben werden.

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

SQLSetStmtOption SQL_QUERY_TIMEOUTund SQL_ASYNC_ENABLE können auf einem CDatabaseHDBC aufgerufen werden.

SQLError kann mit beliebigen oder allen Argumenten NULL aufgerufen werden.

Natürlich SQLAllocEnvSQLAllocConnectSQLDisconnect muss , und SQLFreeConnect muss unterstützt werden.

Executesql

Zusätzlich zum Zuweisen und Freigeben eines temporären HSTMT, ExecuteSQL aufruft SQLExecDirect, SQLNumResultColSQLFetchund SQLMoreResults. SQLCancel kann für das HSTMT aufgerufen werden.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME wird aufgerufen.

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 zum Resultset aufgerufen.

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 von SQL_LONG_VARCHAR und SQL_LONG_VARBINARY Daten werden zwei SQLGetData 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 zum Abrufen des gesamten Ergebnisses ausgeführt.

Wird aktualisiert

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

Versuche zum Aktualisieren eines CRecordset (Momentaufnahme oder Dynasets) 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 für das erste HSTMT abgeschlossen wird, bevor die Anforderung des zweiten HSTMT verarbeitet wird.

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

Wenn es CLongBinarys in den outputColumns gibt, muss die DATA_AT_EXEC-Funktionalität von ODBC unterstützt werden. Dies umfasst die Rückgabe von SQL_NEED_DATA von SQLExecDirectund SQLParamDataSQLPutData.

SQLRowCount wird aufgerufen, nachdem die Ausführung ausgeführt wurde, um zu überprüfen, ob nur 1 Datensatz von der SQLExecDirect.

ForwardOnly Cursor

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

Momentaufnahmecursor

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

SQLGetInfomuss SQL_SCROLL_OPTIONS SQL_SO_STATIC unterstützen.

DynasetCursor

Unten sehen Sie die mindeste Unterstützung, die zum Öffnen eines Dynasets 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.

SQLGetInfomuss SQL_POSITIONED_UPDATES SQL_PS_POSITIONED_DELETE und SQL_PS_POSITIONED_UPDATE unterstützen.

Wenn pessimistische Sperrung angefordert wird, wird außerdem ein Anruf SQLSetPos mit irow 1, fRefresh FALSE und fLock SQL_LCK_EXCLUSIVE durchgeführt.

Siehe auch

Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet