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 SQLExtendedFetch
Bedarf 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 CDatabase
die 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_TIMEOUT
und SQL_ASYNC_ENABLE können auf einem CDatabase
HDBC aufgerufen werden.
SQLError
kann mit beliebigen oder allen Argumenten NULL aufgerufen werden.
Natürlich SQLAllocEnv
SQLAllocConnect
SQLDisconnect
muss , und SQLFreeConnect
muss unterstützt werden.
Executesql
Zusätzlich zum Zuweisen und Freigeben eines temporären HSTMT, ExecuteSQL
aufruft SQLExecDirect
, SQLNumResultCol
SQLFetch
und 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 SQLExecDirect
und SQLParamData
SQLPutData
.
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 SQLExtendedFetch
wird, und stellt die erforderliche Unterstützung selbst bereit.
SQLGetInfo
muss 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.
SQLGetInfo
muss 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