Zuordnen von Ersatzfunktionen für die Abwärtskompatibilität von Anwendungen
Eine ODBC 3.x-Anwendung, die über den ODBC 3.x-Treiber-Manager arbeitet, funktioniert mit einem ODBC 2.x-Treiber, solange keine neuen Features verwendet werden. Sowohl duplizierte Funktionen als auch Verhaltensänderungen wirken sich jedoch auf die Funktionsweise der ODBC 3.x-Anwendung auf einem ODBC 2.x-Treiberaus. Beim Arbeiten mit einem ODBC 2.x-Treiber ordnet der Treiber-Manager die folgenden ODBC 3.x-Funktionenzu, die eine oder mehrere ODBC 2.x-Funktionenersetzt haben, den entsprechenden ODBC 2.x-Funktionen zu.
ODBC 3.x-Funktion | ODBC 2.x-Funktion |
---|---|
SQLAllocHandle | SQLAllocEnv, SQLAlloc Verbinden oder SQLAllocStmt |
SQLBulkOperations | Sqlsetpos |
SQLColAttribute | SQLColAttributes |
SQLEndTran | SQLTransact |
SQLFetch | SQLExtendedFetch |
SQLFetchScroll | SQLExtendedFetch |
SQLFreeHandle | SQLFreeEnv, SQLFree Verbinden oder SQLFreeStmt |
SQLGetConnectAttr | SQLGet Verbinden Option |
Sqlgetdiagrec | Sqlerror |
SQLGetStmtAttr | SQLGetStmtOption[1] |
SQLSetConnectAttr | SQLSet Verbinden Option |
SQLSetStmtAttr | SQLSetStmtOption[1] |
[1] Je nach angeforderten Attribut können auch andere Aktionen ausgeführt werden.
SQLAllocHandle
Der Treiber-Manager ordnet dies nach Bedarf SQLAllocEnv, SQLAlloc Verbinden oder SQLAllocStmt zu. Der folgende Aufruf von SQLAllocHandle:
SQLAllocHandle(HandleType, InputHandle, OutputHandlePtr);
führt dazu, dass der Treiber-Manager die folgende Zuordnung (konzeptionelle, keine Fehlerüberprüfung) durchführt:
switch (HandleType) {
case SQL_HANDLE_ENV: return (SQLAllocEnv(OutputHandlePtr));
case SQL_HANDLE_DBC: return (SQLAllocConnect (InputHandle, OutputHandlePtr));
case SQL_HANDLE_STMT: return (SQLAllocStmt (InputHandle, OutputHandlePtr));
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLBulkOperations
Der Treiber-Manager ordnet dies SQLSetPos zu. Der folgende Aufruf von SQLBulkOperations:
SQLBulkOperations(hstmt, Operation);
führt zu der folgenden Abfolge der Schritte:
Wenn das Argument Operation SQL_ADD ist, ruft der Treiber-Manager SQLSetPos wie folgt auf:
SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);
Wenn das Argument Operation nicht SQL_ADD ist, gibt der Treiber SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück.
Wenn die Anwendung versucht, die SQL_ATTR_ROW_STATUS_PTR zwischen Aufrufen von SQLFetch oder SQLFetchScroll und SQLBulkOperations zu ändern, gibt der Treiber-Manager SQLSTATE HY011 zurück (Attribut kann jetzt nicht festgelegt werden).
Wenn das Argument Operation SQL_ADD ist, muss die Anwendung SQLBindCol aufrufen, um die einzufügenden Daten zu binden. Sie kann SQLSetDescField oder SQLSetDescRec nicht aufrufen, um die einzufügenden Daten zu binden.
Wenn das Argument Operation SQL_ADD ist und die Anzahl der einzufügenden Zeilen nicht mit der aktuellen Rowsetgröße übereinstimmt, muss SQLSetStmtAttr aufgerufen werden, um das attribut der SQL_ATTR_ROW_ARRAY_SIZE-Anweisung auf die Anzahl der Zeilen festzulegen, die eingefügt werden sollen, bevor SQLBulkOperations aufgerufen wird. Um zurück zur vorherigen Rowsetgröße zu rückgängig machen, muss die Anwendung das Attribut der SQL_ATTR_ROW_ARRAY_SIZE-Anweisung festlegen, bevor SQLFetch, SQLFetchScroll oder SQLSetPos aufgerufen wird.
SQLColAttribute
Der Treiber-Manager ordnet dies SQLColAttributes zu. Der folgende Aufruf von SQLColAttribute:
SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);
führt zu der folgenden Abfolge der Schritte:
Wenn FieldIdentifier eine der folgenden Optionen ist:
SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_LENGTH, SQL_DESC_OCTET_LENGTH, SQL_DESC_UNNAMED, SQL_DESC_BASE_COLUMN_NAME, SQL_DESC_LITERAL_PREFIX, SQL_DESC_LITERAL_SUFFIX oder SQL_DESC_LOCAL_TYPE_NAME
der Treiber-Manager gibt SQL_ERROR mit SQLSTATE HY091 (Ungültiger Deskriptorfeldbezeichner) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Der Treiber-Manager ordnet SQL_COLUMN_COUNT, SQL_COLUMN_NAME oder SQL_COLUMN_NULLABLE SQL_DESC_COUNT, SQL_DESC_NAME oder SQL_DESC_NULLABLE zu. (ODBC 2.x-Treiber benötigen nur Unterstützung für SQL_COLUMN_COUNT, SQL_COLUMN_NAME und SQL_COLUMN_NULLABLE, nicht SQL_DESC_COUNT, SQL_DESC_NAME und SQL_DESC_NULLABLE.) Der Aufruf von SQLColAttribute wird zugeordnet zu:
SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);
Alle anderen FieldIdentifier-Werte werden an den Treiber übergeben, wobei SQLColAttribute SQLColAttribute zugeordnet ist, wie zuvor gezeigt.
Wenn BufferLength kleiner als 0 ist, gibt der Treiber-Manager SQL_ERROR mit SQLSTATE HY090 (Ungültige Zeichenfolge oder Pufferlänge) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Wenn FieldIdentifier SQL_DESC_CONCISE_TYPE ist und der zurückgegebene Typ ein präziser Datetime-Datentyp ist, ordnet der Treiber-Manager die Rückgabewerte für Datums-, Uhrzeit- und Zeitstempelcodes zu.
Der Treiber-Manager führt erforderliche Überprüfungen durch, um festzustellen, ob SQLSTATE HY010 (Funktionssequenzfehler) ausgelöst werden muss. Wenn ja, gibt der Treiber-Manager SQL_ERROR und SQLSTATE HY010 (Funktionssequenzfehler) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
SQLEndTran
Der Treiber-Manager ordnet dies SQLTransact zu. Der folgende Aufruf von SQLEndTran:
SQLEndTran(HandleType, Handle, CompletionType);
führt dazu, dass der Treiber-Manager die folgende Zuordnung (konzeptionelle, keine Fehlerüberprüfung) durchführt:
switch (HandleType) {
case SQL_HANDLE_ENV:return(SQLTransact(Handle, SQL_NULL_HDBC, CompletionType));
case SQL_HANDLE_DBC:return(SQLTransact(SQL_NULL_HENV, Handle, CompletionType);
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLFetch
Der Treiber-Manager ordnet dies SQLExtendedFetch mit einem FetchOrientation-Argument von SQL_FETCH_NEXT zu. Der folgende Aufruf von SQLFetch:
SQLFetch (StatementHandle);
führt dazu, dass der Treiber-Manager SQLExtendedFetch wie folgt aufruft:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, &RowCount, RowStatusArray);
In diesem Aufruf wird das pcRow-Argument auf den Wert festgelegt, auf den die Anwendung das Attribut der SQL_ATTR_ROWS_FETCHED_PTR-Anweisung über einen Aufruf von SQLSetStmtAttr festlegt.
Hinweis
Wenn die Anwendung SQLSetStmtAttr aufruft, um SQL_ATTR_ROW_STATUS_PTR auf ein Statusarray zu verweisen, speichert der Treiber-Manager den Zeiger zwischen. RowStatusArray kann mit einem Nullzeiger gleich sein.
Wenn der Treiber SQLExtendedFetch nicht unterstützt und die Cursorbibliothek geladen wird, verwendet der Treiber-Manager die SQLExtendedFetch-Datei der Cursorbibliothek, um SQLFetch sqlExtendedFetch zuzuordnen. Wenn der Treiber SQLExtendedFetch nicht unterstützt und die Cursorbibliothek nicht geladen wird, übergibt der Treiber-Manager den Aufruf an SQLFetch an den Treiber. Wenn die Anwendung SQLSetStmtAttr aufruft, um SQL_ATTR_ROW_STATUS_PTR festzulegen, stellt der Treiber-Manager sicher, dass das Array aufgefüllt wird. Wenn die Anwendung SQLSetStmtAttr aufruft, um SQL_ATTR_ROWS_FETCHED_PTR festzulegen, legt der Treiber-Manager dieses Feld auf 1 fest.
SQLFetchScroll
Der Treiber-Manager ordnet dies SQLExtendedFetch zu. Der folgende Aufruf von SQLFetchScroll:
SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);
führt zu der folgenden Abfolge der Schritte:
Wenn die Anwendung SQLSetStmtAttr aufruft, um SQL_ATTR_ROW_STATUS_PTR festzulegen (wodurch das feld SQL_DESC_ARRAY_STATUS_PTR in der IRD festgelegt wird), um auf ein Statusarray zu verweisen, speichert der Treiber-Manager diesen Zeiger zwischen. Let this pointer be RowStatusArray; otherwise, let RowStatusArray be equal to a null pointer. Wenn das Argument RowStatusArray auf einen Nullzeiger festgelegt ist, generiert der Treiber-Manager ein Zeilenstatusarray .
Wenn FetchOrientation nicht einer von SQL_FETCH_NEXT, SQL_FETCH_PRIOR, SQL_FETCH_ABSOLUTE, SQL_FETCH_RELATIVE, SQL_FETCH_FIRST, SQL_FETCH_LAST oder SQL_FETCH_BOOKMARK ist, gibt der Treiber-Manager mit SQL_ERROR und SQLSTATE HY106 (Fetch-Typ außerhalb des Bereichs) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Schreibweise:
Wenn FetchOrientation gleich SQL_FETCH_BOOKMARK ist, dann:
Wenn SQLSetStmtAttr zuvor aufgerufen wurde, um den Wert von SQL_ATTR_FETCH_BOOKMARK_PTR festzulegen, lassen Sie Bmk den Wert sein, der durch das Ableiten des Zeigers SQL_DESC_FETCH_BOOKMARK_PTR abgerufen wird.
Andernfalls geben Sie SQL_ERROR mit SQLSTATE HY111 (Ungültiger Textmarkenwert) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Der Treiber-Manager ruft jetzt SQLExtendedFetch wie folgt auf:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);
Andernfalls ruft der Treiber-Manager SQLExtendedFetch wie folgt auf:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, pcRow, RowStatusArray);
Bei diesen Aufrufen wird das pcRow-Argument auf den Wert festgelegt, auf den die Anwendung das Attribut der SQL_ATTR_ROWS_FETCHED_PTR-Anweisung über einen Aufruf von SQLSetStmtAttr festlegt.
SQL_ATTR_ROW_ARRAY_SIZE wird SQL_ROWSET_SIZE zugeordnet.
Wenn rc mit SQL_SUCCESS oder SQL_SUCCESS_WITH_INFO identisch ist und FetchOrientation mit SQL_FETCH_BOOKMARK und FetchOffset nicht gleich 0 ist, sendet der Treiber-Manager eine Warnung, SQLSTATE 01S10 (Versuch, von einem Textmarkenversatz abzurufen, offsetwert ignoriert) und gibt SQL_SUCCESS_WITH_INFO zurück.
SQLFreeHandle
Der Treiber-Manager ordnet dies nach Bedarf SQLFreeEnv, SQLFree Verbinden oder SQLFreeStmt zu. Der folgende Aufruf von SQLFreeHandle:
SQLFreeHandle(HandleType, Handle);
führt dazu, dass der Treiber-Manager die folgende Zuordnung (konzeptionelle, keine Fehlerüberprüfung) durchführt:
switch (HandleType) {
case SQL_HANDLE_ENV: return (SQLFreeEnv(Handle));
case SQL_HANDLE_DBC: return (SQLFreeConnect(Handle));
case SQL_HANDLE_STMT: return (SQLFreeStmt(Handle, SQL_DROP));
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLGetConnectAttr
Der Treiber-Manager ordnet dies SQLGet Verbinden Option zu. Der folgende Aufruf von SQLGet Verbinden Attr:
SQLGetConnectAttr(ConnectionHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);
führt zu der folgenden Abfolge der Schritte:
Wenn das Attribut kein treiberdefiniertes Verbindungs- oder Anweisungsattribut ist und kein in ODBC 2.x definiertes Attribut ist, gibt der Treiber-Manager SQL_ERROR mit SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück. Es gelten keine weiteren Regeln in diesem Abschnitt.
Wenn das Attribut SQL_ATTR_AUTO_IPD oder SQL_ATTR_METADATA_ID entspricht, gibt der Treiber-Manager SQL_ERROR mit SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück.
Der Treiber-Manager führt erforderliche Überprüfungen durch, um festzustellen, ob SQLSTATE 08003 (Verbinden ion nicht geöffnet) oder SQLSTATE HY010 (Funktionssequenzfehler) ausgelöst werden muss. Wenn ja, gibt der Treiber-Manager SQL_ERROR zurück und sendet die entsprechende Fehlermeldung. Es gelten keine weiteren Regeln dieses Abschnitts.
Der Treiber-Manager ruft SQLGet Verbinden Option wie folgt auf:
SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);
Beachten Sie, dass " BufferLength " und "StringLengthPtr " ignoriert werden.
SQLGetData
Wenn eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiber arbeitet, SQLGetData mit dem Argument ColumnNumber auf 0 aufruft, ordnet der ODBC 3.x-Treiber-Manager dies einem Aufruf von SQLGetStmtOption zu, wobei das Option-Attribut auf SQL_GET_BOOKMARK festgelegt ist.
'SQLGetStmtAttr'
Der Treiber-Manager ordnet dies SQLGetStmtOption zu. Der folgende Aufruf von SQLGetStmtAttr:
SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);
führt zu der folgenden Abfolge der Schritte:
Wenn das Attribut kein treiberdefiniertes Verbindungs- oder Anweisungsattribut ist und kein in ODBC 2.x definiertes Attribut ist, gibt der Treiber-Manager SQL_ERROR mit SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück. Es gelten keine weiteren Regeln in diesem Abschnitt.
If Attribute is one of the following:
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_AUTO_IPD
SQL_ATTR_ROW_BIND_TYPE
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_METADATA_ID
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PREDICATE_PTR
SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_PARAM_OPERATION_PTR
der Treiber-Manager gibt SQL_ERROR mit SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Der Treiber-Manager führt erforderliche Überprüfungen durch, um festzustellen, ob SQLSTATE HY010 (Funktionssequenzfehler) ausgelöst werden muss. Wenn ja, gibt der Treiber-Manager SQL_ERROR und SQLSTATE HY010 (Funktionssequenzfehler) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Wenn das Attribut SQL_ATTR_ROWS_FETCHED_PTR entspricht, gibt der Treiber-Manager einen Zeiger auf die interne Treiber-Manager-Variable cRow zurück, die er in einem Aufruf von SQLExtendedFetch verwendet oder verwendet. Es gelten keine weiteren Regeln dieses Abschnitts.
Wenn das Attribut SQL_DESC_FETCH_BOOKMARK_PTR entspricht, gibt der Treiber-Manager den entsprechenden Zeiger zurück, den er während eines Aufrufs von SQLSetStmtAttr zwischengespeichert hat.
Wenn attribut gleich SQL_ATTR_ROW_STATUS_PTR ist, gibt der Treiber-Manager den entsprechenden Zeiger zurück, den er während eines Aufrufs von SQLSetStmtAttr zwischengespeichert hat.
Der Treiber-Manager ruft SQLGetStmtOption wie folgt auf:
SQLGetStmtOption (hstmt, fOption, pvParam);
dabei werden "hstmt", "fOption" und "pvParam " auf die Werte " StatementHandle", "Attribute" und "ValuePtr" festgelegt. PufferLength und StringLengthPtr werden ignoriert.
SQLSetConnectAttr
Der Treiber-Manager ordnet dies SQLSet Verbinden Option zu. Der folgende Aufruf von SQLSet Verbinden Attr:
SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);
führt zu der folgenden Abfolge der Schritte:
Wenn das Attribut kein treiberdefiniertes Verbindungs- oder Anweisungsattribut ist und kein in ODBC 2.x definiertes Attribut ist, gibt der Treiber-Manager SQL_ERROR mit SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück. Es gelten keine weiteren Regeln in diesem Abschnitt.
Wenn das Attribut SQL_ATTR_AUTO_IPD entspricht, gibt der Treiber-Manager SQL_ERROR mit SQLSTATE HY092 zurück (Ungültiger Attribut-/Optionsbezeichner).
Der Treiber-Manager führt erforderliche Überprüfungen durch, um festzustellen, ob SQLSTATE 08003 (Verbinden ion nicht geöffnet) oder SQLSTATE HY010 (Funktionssequenzfehler) ausgelöst werden muss. Wenn einer dieser Fehler ausgelöst werden muss, gibt der Treiber-Manager SQL_ERROR zurück und sendet die entsprechende Fehlermeldung. Es gelten keine weiteren Regeln dieses Abschnitts.
Der Treiber-Manager ruft SQLSet Verbinden Option wie folgt auf:
SQLSetConnectOption (hdbc, fOption, vParam);
wobei hdbc, fOption und vParam auf die Werte von Verbinden ionHandle, Attribute und ValuePtr festgelegt werden. StringLengthPtr wird ignoriert.
Hinweis
Die Möglichkeit zum Festlegen von Anweisungsattributen auf Verbindungsebene ist veraltet. Anweisungsattribute sollten niemals auf verbindungsebene durch eine ODBC 3.x-Anwendung festgelegt werden.
SQLSetStmtAttr
Der Treiber-Manager ordnet dies SQLSetStmtOption zu. Der folgende Aufruf von SQLSetStmtAttr:
SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);
führt zu der folgenden Abfolge der Schritte:
Wenn das Attribut kein treiberdefiniertes Verbindungs- oder Anweisungsattribut ist und kein in ODBC 2.x definiertes Attribut ist, gibt der Treiber-Manager SQL_ERROR mit SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück. Es gelten keine weiteren Regeln in diesem Abschnitt.
If Attribute is one of the following:
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_AUTO_IPD
SQL_ATTR_ROW_BIND_TYPE
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_METADATA_ID
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PREDICATE_PTR
SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_PARAM_OPERATION_PTR
der Treiber-Manager gibt SQL_ERROR mit SQLSTATE HY092 (Ungültiger Attribut-/Optionsbezeichner) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Der Treiber-Manager führt die erforderlichen Prüfungen aus, um festzustellen, ob SQLSTATE HY010 (Funktionssequenzfehler) ausgelöst werden muss. Wenn ja, gibt der Treiber-Manager SQL_ERROR und SQLSTATE HY010 (Funktionssequenzfehler) zurück. Es gelten keine weiteren Regeln dieses Abschnitts.
Wenn das Attribut mit SQL_ATTR_PARAMSET_SIZE oder SQL_ATTR_PARAMS_PROCESSED_PTR identisch ist, lesen Sie weiter unten in diesem Thema den Abschnitt "Zuordnungen für die Behandlung von Parameterarrays". Es gelten keine weiteren Regeln dieses Abschnitts.
Wenn attribut gleich SQL_ATTR_ROWS_FETCHED_PTR ist, speichert der Treiber-Manager den Zeigerwert für die spätere Verwendung mit SQLFetchScroll zwischen.
Wenn das Attribut SQL_ATTR_ROW_STATUS_PTR entspricht, speichert der Treiber-Manager den Zeigerwert für die spätere Verwendung mit SQLFetchScroll oder SQLSetPos zwischen. Es gelten keine weiteren Regeln dieses Abschnitts.
Wenn attribut gleich SQL_ATTR_FETCH_BOOKMARK_PTR ist, speichert der Treiber-Manager ValuePtr zwischen und verwendet den zwischengespeicherten Wert später in einem Aufruf von SQLFetchScroll. Es gelten keine weiteren Regeln dieses Abschnitts.
Der Treiber-Manager ruft SQLSetStmtOption wie folgt auf:
SQLSetStmtOption (hstmt, fOption, vParam);
dabei werden "hstmt", "fOption" und "vParam " auf die Werte " StatementHandle", "Attribute" bzw . "ValuePtr" festgelegt. Das Argument StringLength wird ignoriert.
Wenn ein ODBC 2.x-Treiber Zeichenzeichenfolgen-, treiberspezifische Anweisungsoptionen unterstützt, sollte eine ODBC 3.x-Anwendung SQLSetStmtOption aufrufen, um diese Optionen festzulegen.
Zuordnungen für die Behandlung von Parameterarrays
Wenn die Anwendung aufruft:
SQLSetStmtAttr (StatementHandle, SQL_ATTR_PARAMSET_SIZE, Size, StringLength);
Der Treiber-Manager ruft folgendes auf:
SQLParamOptions (StatementHandle, Size, &RowCount);
Der Treiber-Manager gibt später einen Zeiger auf diese Variable zurück, wenn die Anwendung SQLGetStmtAttr aufruft, um SQL_ATTR_PARAMS_PROCESSED_PTR abzurufen. Der Treiber-Manager kann diese interne Variable erst ändern, wenn der Anweisungshandle an den vorbereiteten oder zugewiesenen Zustand zurückgegeben wird.
Eine ODBC 3.x-Anwendung kann SQLGetStmtAttr aufrufen, um den Wert von SQL_ATTR_PARAMS_PROCESSED_PTR abzurufen, obwohl es das feld SQL_DESC_ARRAY_SIZE in der APD nicht explizit festgelegt hat. Diese Situation kann z. B. auftreten, wenn die Anwendung über eine generische Routine verfügt, die überprüft, ob die aktuelle "Zeile" von Parametern verarbeitet wird, wenn SQLExecute SQL_NEED_DATA zurückgibt. Diese Routine wird aufgerufen, unabhängig davon, ob die SQL_DESC_ARRAY_SIZE 1 oder größer als 1 ist. Um dies zu berücksichtigen, muss der Treiber-Manager diese interne Variable definieren, unabhängig davon, ob die Anwendung SQLSetStmtAttr aufgerufen hat, um das feld SQL_DESC_ARRAY_SIZE in APD festzulegen. Wenn SQL_DESC_ARRAY_SIZE nicht festgelegt wurde, muss der Treiber-Manager sicherstellen, dass diese Variable den Wert 1 enthält, bevor sie von SQLExecDirect oder SQLExecute zurückgegeben wird.
Fehlerbehandlung
In ODBC 3.x füllt das Aufrufen von SQLFetch oder SQLFetchScroll die SQL_DESC_ARRAY_STATUS_PTR im IRD auf, und das SQL_DIAG_ROW_NUMBER Feld eines bestimmten Diagnosedatensatzes enthält die Anzahl der Zeilen im Rowset, zu denen dieser Datensatz gehört. Dadurch kann die Anwendung eine Fehlermeldung mit einer bestimmten Zeilenposition korrelieren.
Ein ODBC 2.x-Treiber kann diese Funktionalität nicht bereitstellen. Es wird jedoch eine Fehlerabgrenzung mit SQLSTATE 01S01 (Fehler in Zeile) bereitgestellt. Eine ODBC 3.x-Anwendung, die SQLFetch oder SQLFetchScroll verwendet, während ein ODBC 2.x-Treiberverwendet wird, muss sich dieser Tatsache bewusst sein. Beachten Sie auch, dass eine solche Anwendung SQLGetDiagField nicht aufrufen kann, um das SQL_DIAG_ROW_NUMBER Feld trotzdem abzurufen. Eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiber arbeitet, kann SQLGetDiagField nur mit einem DiagIdentifier-Argumentvon SQL_DIAG_MESSAGE_TEXT, SQL_DIAG_NATIVE, SQL_DIAG_RETURNCODE oder SQL_DIAG_SQLSTATE aufrufen. Der ODBC 3.x-Treiber-Manager Standard die Diagnosedatenstruktur beim Arbeiten mit einem ODBC 2.x-Treiber enthält, der ODBC 2.x-Treiber gibt jedoch nur diese vier Felder zurück.
Wenn eine ODBC 2.x-Anwendung mit einem ODBC 2.x-Treiber arbeitet, wenn ein Vorgang mehrere Fehler verursachen kann, die vom Treiber-Manager zurückgegeben werden, können verschiedene Fehler vom ODBC 3.x-Treiber-Manager zurückgegeben werden als vom ODBC 2.x-Treiber-Manager.
Zuordnungen für Textmarkenvorgänge
Der ODBC 3.x-Treiber-Manager führt die folgenden Zuordnungen aus, wenn eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiber arbeitet, Lesezeichenvorgänge ausführt.
SQLBindCol
Wenn eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiberarbeitet, SQLBindCol aufruft, um eine Bindung an Spalte 0 mit fCType gleich SQL_C_VARBOOKMARK, überprüft der ODBC 3.x-Treiber-Manager, ob das Argument BufferLength kleiner als 4 oder größer als 4 ist, und gibt in diesem Fällen SQLSTATE HY090 (Ungültige Zeichenfolge oder Pufferlänge) zurück. Wenn das Argument BufferLength gleich 4 ist, ruft der Treiber-Manager SQLBindCol im Treiber auf, nachdem fCType durch SQL_C_BOOKMARK ersetzt wurde.
SQLColAttribute
Wenn eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiberarbeitet, SQLColAttribute aufruft, wobei das Argument ColumnNumber auf 0 festgelegt ist, gibt der Treiber-Manager die in der folgenden Tabelle aufgeführten FieldIdentifier-Werte zurück.
FieldIdentifier | Wert |
---|---|
SQL_DESC_AUTO_UNIQUE_VALUE | SQL_FALSE |
SQL_DESC_CASE_SENSITIVE | SQL_FALSE |
SQL_DESC_CATALOG_NAME | "" (leere Zeichenfolge) |
SQL_DESC_CONCISE_TYPE | SQL_BINARY |
SQL_DESC_COUNT | Derselbe Wert, der von SQLNumResultCols zurückgegeben wird |
SQL_DESC_DATETIME_INTERVAL_CODE | 0 |
SQL_DESC_DISPLAY_SIZE | 8 |
SQL_DESC_FIXED_PREC_SCALE | SQL_FALSE |
SQL_DESC_LABEL | "" (leere Zeichenfolge) |
SQL_DESC_LENGTH | 0 |
SQL_DESC_LITERAL_PREFIX | "" (leere Zeichenfolge) |
SQL_DESC_LITERAL_SUFFIX | "" (leere Zeichenfolge) |
SQL_DESC_LOCAL_TYPE_NAME | "" (leere Zeichenfolge) |
SQL_DESC_NAME | "" (leere Zeichenfolge) |
SQL_DESC_NULLABLE | SQL_NO_NULLS |
SQL_DESC_OCTET_LENGTH | 4 |
SQL_DESC_PRECISION | 4 |
SQL_DESC_SCALE | 0 |
SQL_DESC_SCHEMA_NAME | "" (leere Zeichenfolge) |
SQL_DESC_SEARCHABLE | SQL_PRED_NONE |
SQL_DESC_TABLE_NAME | "" (leere Zeichenfolge) |
SQL_DESC_TYPE | SQL_BINARY |
SQL_DESC_TYPE_NAME | "" (leere Zeichenfolge) |
SQL_DESC_UNNAMED | SQL_UNNAMED |
SQL_DESC_UNSIGNED | SQL_FALSE |
SQL_DESC_UPDATEABLE | SQL_ATTR_READ_ONLY |
SQLDescribeCol
Wenn eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiberarbeitet, SQLDescribeCol aufruft, wobei das Argument ColumnNumber auf 0 festgelegt ist, gibt der Treiber-Manager die in der folgenden Tabelle aufgeführten Werte zurück.
Buffer | Wert |
---|---|
ColumnName | "" (leere Zeichenfolge) |
*NameLengthPtr | 0 |
*DataTypePtr | SQL_BINARY |
*ColumnSizePtr | 4 |
*DecimalDigitsPtr | 0 |
*NullablePtr | SQL_NO_NULLS |
SQLGetData
Wenn eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiber arbeitet, den folgenden Aufruf von SQLGetData zum Abrufen einer Textmarke vornimmt:
SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)
der Aufruf wird SQLGetStmtOption mit einer fOption von SQL_GET_BOOKMARK wie folgt zugeordnet:
SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)
wobei "hstmt " bzw . "pvParam " auf die Werte in "StatementHandle " bzw . "TargetValuePtr" festgelegt sind. Die Textmarke wird im Puffer zurückgegeben, auf den das PvParam -Argument (TargetValuePtr) verweist. Der Wert im Puffer, auf den das argument StrLen_or_IndPtr im Aufruf von SQLGetData verweist, ist auf 4 festgelegt.
Diese Zuordnung ist erforderlich, um den Fall zu berücksichtigen, in dem SQLFetch vor dem Aufruf von SQLGetData aufgerufen wurde, und der ODBC 2.x-Treiberhat SQLExtendedFetch nicht unterstützt. In diesem Fall würde SQLFetch an den ODBC 2.x-Treiber übergeben, in diesem Fall wird das Abrufen von Textmarken nicht unterstützt.
SQLGetData kann nicht mehrmals in einem ODBC 2.x-Treiber aufgerufen werden, um eine Textmarke in Teilen abzurufen, sodass das Aufrufen von SQLGetData mit dem Argument BufferLength auf einen Wert kleiner als 4 festgelegt ist, und das auf 0 festgelegte Argument ColumnNumber gibt SQLSTATE HY090 zurück (Ungültige Zeichenfolge oder Pufferlänge). SQLGetData kann jedoch mehrmals aufgerufen werden, um dieselbe Textmarke abzurufen.
SQLSetStmtAttr
Wenn eine ODBC 3.x-Anwendung, die mit einem ODBC 2.x-Treiber arbeitet, SQLSetStmtAttr aufruft, um das attribut SQL_ATTR_USE_BOOKMARKS auf SQL_UB_VARIABLE festzulegen, legt der Treiber-Manager das Attribut auf SQL_UB_ON im zugrunde liegenden ODBC 2.x-Treiber fest.