Freigeben über


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-Treiber-Writer. Er beschreibt allgemeine Anforderungen und Annahmen aus ODBC-Funktionalität, dass die MFC-Datenbankklassen machen, und die verschiedenen erwarteten Semantik- Details. Die erforderliche Treiberfunktionalität, um die drei Modi geöffneten CRecordset (forwardOnly, Momentaufnahme und dynaset) zu unterstützen werden beschrieben.

Cursorbibliothek ODBC

Die MFC-Datenbankklassen bieten dem Benutzer Funktionen dar, die in vielen Fällen die Funktionalität übertrifft, die von den meisten Ebene 1 ODBC-Treibern bereitgestellt wird. Glücklicherweise überlagert sich Cursorbibliothek ODBC zwischen den Datenbankklassen und dem Treiber und stellt automatisch viele dieser zusätzlichen Funktionen.

Beispielsweise unterstützen die meisten 1.0 Treiber nicht Rückwärtsscrollen. Die Cursorbibliothek kann erkennen, und dieses wird Zeilen vom Treiber zwischenspeichern und diese darstellt, wie auf FETCH_PREV-Aufrufen in SQLExtendedFetch angefordert.

Ein anderes wichtiges Beispiel der Cursorbibliotheksabhängigkeit ist positionierbare Aktualisierungen. Die meisten verfügen nicht 1.0 Treiber positionierbare Aktualisierungen, die Cursorbibliothek generiert Aktualisierungsanweisungen, die eine Zielzeile auf der Datenquelle angeben, die nach den aktuellen Werten der zwischengespeicherten Daten basiert wird, oder einen zwischengespeicherten Timestampwert.

Die Klassenbibliothek nutzt nie mehrere Rowsets aus. Deshalb werden die wenigsten SQLSetPos-Anweisungen immer angewendet, dass 1 % des Rowsets zu Zeile.

CDatabases

Jedes CDatabase ordnet einzelnen HDBC. (Wenn Funktion CDatabaseExecuteSQL verwendet wird, ist vorübergehend HSTMT zugeordnet.) Somit, wenn mehrere CDatabases erforderlich sind, müssen mehrere HDBCs pro HENV unterstützt werden.

Die Datenbankklassen benötigen die Cursorbibliothek. Dies wird in einem SQLSetConnections - Aufruf SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC übernommen.

SQLDriverConnect, SQL_DRIVER_COMPLETE wird von CDatabase::Open verwendet, um die Verbindung zur Datenquelle einzurichten.

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

Damit Transaktionen für CDatabase und die abhängigen Recordsets unterstützt werden können, müssen SQLGetInfo und SQL_CURSOR_COMMIT_BEHAVIORSQL_CURSOR_ROLLBACK_BEHAVIORSQL_CR_PRESERVE verfügen. Andernfalls versucht werden, Transaktionssteuerelement auszuführen ignoriert.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY muss unterstützt werden. Wenn es "Y" zurückgibt, werden keine Aktualisierungsvorgänge in der Datenquelle ausgeführt.

Wenn CDatabase geöffnetes schreibgeschützt ist, wird versucht, die schreibgeschützte Datenquelle festzulegen mit SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY ausgeführt.

Wenn Bezeichner der Veranschlagung benötigen, sollten diese Informationen vom Treiber mit einem Aufruf SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR zurückgegeben werden.

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

SQLSetStmtOption SQL_QUERY_TIMEOUT und SQL_ASYNC_ENABLE werden von CDatabaseHDBC aufgerufen werden.

SQLError wird mit allen aufgerufen werden, oder alle Argumente wird ungültig.

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

ExecuteSQL

Zusätzlich zum Belegen und zum Freigeben von temporären HSTMT ruft ExecuteSQL, SQLExecDirect, SQLFetch, SQLNumResultCol und SQLMoreResults auf. SQLCancel wird auf HSTMT aufgerufen werden.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME wird aufgerufen.

BeginTrans, CommitTrans, Rollback-

SQLSetConnectOption und SQL_AUTOCOMMITSQLTransact SQL_COMMIT, SQL_ROLLBACK und SQL_AUTOCOMMIT werden aufgerufen, wenn Transaktionsanforderungen gemacht werden.

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (für Öffnen und Requery), SQLExecDirect (für Aktualisierungsvorgänge), SQLFreeStmt muss unterstützt werden. Damit SQLNumResultCols und SQLDescribeCol werden das Resultset zu verschiedenen Zeitpunkten aufgerufen.

SQLSetParam wird für zahlreiche für Bindungsparameterdaten und DATA_AT_EXEC-Funktionen verwendet.

SQLBindCol wird für zahlreiche verwendet, um Ausgabespaltendatenspeicherungsspeicherorte mit ODBC zu registrieren.

Zwei SQLGetData Aufrufe werden verwendet, um SQL_LONG_VARCHAR und SQL_LONG_VARBINARY Daten abzurufen. Die Versuche im ersten Aufruf, die Gesamtlänge des Spaltenwerts durch Aufrufen von SQLGetData mit cbMaxValue von 0, aber mit einem gültigen pcbValue zu suchen. Wenn pcbValue SQL_NO_TOTAL enthält, wird eine Ausnahme ausgelöst. Andernfalls wird HGLOBAL zugeordnet und ein anderer SQLGetData aufgerufen, um das ganze Ergebnis abzurufen.

Aktualisieren

Wenn vollständig Sperren angefordert wird, wird SQLGetInfoSQL_LOCK_TYPES abgefragt. Wenn SQL_LCK_EXCLUSIVE nicht unterstützt wird, wird eine Ausnahme ausgelöst.

Versucht, CRecordset zu aktualisieren (Momentaufnahme oder dynaset) führen eine Sekunde HSTMT zugeordnet. Für Treiber, die nicht zweites HSTMT vorsehen, simuliert die Cursorbibliothek diese Funktionalität. Leider bedeutet dies möglicherweise gelegentlich das Erzwingen der aktuellen Abfrage auf ersten HSTMT abgeschlossen, bevor die zweite HSTMT Anforderung verarbeitet.

SQLFreeStmt SQL_CLOSE und SQL_RESET_PARAMS und SQLGetCursorName werden während der Aktualisierungsvorgänge aufgerufen.

Wenn es CLongBinarys in outputColumns gibt, muss DATA_AT_EXEC-Funktionen unterstützt werden. Ebenfalls Rückgabe von SQL_NEED_DATA von SQLExecDirect, SQLParamData und SQLPutData ein.

SQLRowCount aufgerufen wird, nachdem von sicherzustellen ausgeführt, dass nur 1 Datensatz durch SQLExecDirect aktualisiert wurde.

ForwardOnly-Cursor

Nur SQLFetch ist für die Verschieben Operationen erforderlich. Beachten Sie, dass forwardOnly Cursor keine Aktualisierungen unterstützen.

Momentaufnahme-Cursor

Momentaufnahmefunktionalität erfordert SQLExtendedFetch Unterstützung. Wie oben erwähnt, erkennt die ODBC-Cursorbibliothek, wann ein Treiber SQLExtendedFetch nicht unterstützt, und es bleibt die erforderliche Unterstützung selbst.

SQLGetInfo, SQL_SCROLL_OPTIONS muss SQL_SO_STATIC unterstützt.

Dynaset-Cursor

Unten ist die minimale Unterstützung, die erforderlich ist, ein Dynaset zu öffnen:

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

SQLGetInfo, SQL_SCROLL_OPTIONS muss SQL_SO_KEYSET_DRIVEN unterstützt.

SQLGetInfo, SQL_ROW_UPDATES muss "Y" zurückgegeben.

SQLGetInfo, SQL_POSITIONED_UPDATES muss SQL_PS_POSITIONED_DELETE und SQL_PS_POSITIONED_UPDATE vorsehen.

Wenn vollständig Sperren angefordert wird, wird ein Aufruf von SQLSetPos mit irow 1, fRefresh FALSE und Anzahl von SQL_LCK_EXCLUSIVE vorgenommen.

Siehe auch

Weitere Ressourcen

Technische Hinweise – nach Nummern geordnet

Technische Hinweise – nach Kategorien geordnet