Freigeben über


Schreiben von ODBC-3.x-Anwendungen

Wenn ein ODBC 2.x-Anwendung auf ODBC 3.x aktualisiert wird, sollte sie so geschrieben werden, dass sie sowohl mit ODBC 2.x- als auch mit 3.x-Treibern funktioniert. Die Anwendung sollte bedingten Code enthalten, um die ODBC 3.x-Features vollständig nutzen zu können.

Das Attribut SQL_ATTR_ODBC_VERSION Umgebung sollte auf SQL_OV_ODBC2 festgelegt werden. Dadurch wird sichergestellt, dass sich der Treiber in Bezug auf die im Abschnitt Verhaltensänderungen beschriebenen Änderungen wie ein ODBC 2.x-Treiber verhält.

Wenn die Anwendung eines der im Abschnitt "Neue Features" beschriebenen Features verwendet, sollte bedingter Code verwendet werden, um festzustellen, ob es sich bei dem Treiber um einen ODBC 3.x- oder ODBC 2.x-Treiber handelt. Die Anwendung verwendet SQLGetDiagField und SQLGetDiagRec , um ODBC 3.x SQLSTATEs abzurufen, während die Fehlerverarbeitung für diese bedingten Codefragmente ausgeführt wird. Die folgenden Punkte zu den neuen Funktionen sollten berücksichtigt werden:

  • Eine Anwendung, die von der Änderung des Zeilensatzgrößenverhaltens betroffen ist, sollte darauf achten, SQLFetch nicht aufzurufen, wenn die Arraygröße größer als 1 ist. Diese Anwendungen sollten Aufrufe von SQLExtendedFetch durch Aufrufe von SQLSetStmtAttr ersetzen, um das Attribut der SQL_ATTR_ARRAY_STATUS_PTR-Anweisung und sqlFetchScroll festzulegen, sodass sie gemeinsamen Code haben, der sowohl mit ODBC 3.x- als auch ODBC 2.x-Treibern funktioniert. Da SQLSetStmtAttr mit SQL_ATTR_ROW_ARRAY_SIZE SQLSetStmtAttr mit SQL_ROWSET_SIZE für ODBC 2.x-Treiber zugeordnet wird, können Anwendungen einfach SQL_ATTR_ROW_ARRAY_SIZE für ihre Multirow-Abrufvorgänge festlegen.

  • Die meisten Anwendungen, die ein Upgrade durchführen, sind nicht von Änderungen in SQLSTATE-Codes betroffen. Für anwendungen, die betroffen sind, können sie eine mechanische Suche durchführen und in den meisten Fällen mithilfe der Fehlerkonvertierungstabelle im Abschnitt "SQLSTATE-Zuordnung" ersetzen, um ODBC 3.x-Fehlercodes in ODBC 2.x-Codes zu konvertieren. Da der ODBC 3.x-Treiber-Manager eine Zuordnung von ODBC 2.x SQLSTATEs zu ODBC 3.x SQLSTATEs durchführt, müssen diese Anwendungsautoren nur die ODBC 3.x SQLSTATEs überprüfen und sich keine Gedanken darüber machen, ODBC 2.x SQLSTATEs in bedingten Code einzuschließt.

  • Wenn eine Anwendung die Datentypen Datum, Uhrzeit und Zeitstempel hervorragend verwendet, kann die Anwendung selbst als ODBC 2.x-Anwendung deklarieren und den vorhandenen Code anstelle von Konditionalcode verwenden.

Das Upgrade sollte auch die folgenden Schritte enthalten:

  • Rufen Sie SQLSetEnvAttr auf, bevor Sie eine Verbindung zuweisen, um das SQL_ATTR_ODBC_VERSION Umgebungsattribut auf SQL_OV_ODBC2 festzulegen.

  • Ersetzen Sie alle Aufrufe von SQLAllocEnv, SQLAlloc Verbinden oder SQLAllocStmt durch Aufrufe von SQLAllocHandle durch das entsprechende HandleType-Argument von SQL_HANDLE_ENV, SQL_HANDLE_DBC oder SQL_HANDLE_STMT.

  • Ersetzen Sie alle Aufrufe von SQLFreeEnv oder SQLFree Verbinden durch Aufrufe von SQLFreeHandle durch das entsprechende HandleType-Argument von SQL_HANDLE_DBC oder SQL_HANDLE_STMT.

  • Ersetzen Sie alle Aufrufe von SQLSet Verbinden Option durch Aufrufe von SQLSet Verbinden Attr. Wenn Sie ein Attribut festlegen, dessen Wert eine Zeichenfolge ist, legen Sie das Argument StringLength entsprechend fest. Ändern Sie das Attributargument von SQL_XXXX in SQL_ATTR_XXXX.

  • Ersetzen Sie alle Aufrufe von SQLGet Verbinden Option durch Aufrufe von SQLGet Verbinden Attr. Wenn Sie eine Zeichenfolge oder ein binäres Attribut abrufen, legen Sie BufferLength auf den entsprechenden Wert fest, und übergeben Sie ein StringLength-Argument . Ändern Sie das Attributargument von SQL_XXXX in SQL_ATTR_XXXX.

  • Ersetzen Sie alle Aufrufe von SQLSetStmtOption durch Aufrufe von SQLSetStmtAttr. Wenn Sie ein Attribut festlegen, dessen Wert eine Zeichenfolge ist, legen Sie das Argument StringLength entsprechend fest. Ändern Sie das Attributargument von SQL_XXXX in SQL_ATTR_XXXX.

  • Ersetzen Sie alle Aufrufe von SQLGetStmtOption durch Aufrufe von SQLGetStmtAttr. Wenn Sie eine Zeichenfolge oder ein binäres Attribut abrufen, legen Sie BufferLength auf den entsprechenden Wert fest, und übergeben Sie ein StringLength-Argument . Ändern Sie das Attributargument von SQL_XXXX in SQL_ATTR_XXXX.

  • Ersetzen Sie alle Aufrufe von SQLTransact durch Aufrufe von SQLEndTran. Wenn das am weitesten rechts gültige Handle im SQLTransact-Aufruf ein Umgebungshandle ist, sollte ein HandleType-Argument von SQL_HANDLE_ENV im SQLEndTran-Aufruf mit dem entsprechenden Handle-Argument verwendet werden. Wenn der am weitesten rechts gültige Handle in Ihrem SQLTransact-Aufruf ein Verbindungshandle ist, sollte ein HandleType-Argument von SQL_HANDLE_DBC im SQLEndTran-Aufruf mit dem entsprechenden Handle-Argument verwendet werden.

  • Ersetzen Sie alle Aufrufe von SQLColAttributes durch Aufrufe von SQLColAttribute. Wenn das Argument FieldIdentifier entweder SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE oder SQL_COLUMN_LENGTH ist, ändern Sie nichts anderes als den Namen der Funktion. Wenn nicht, ändern Sie FieldIdentifier von SQL_COLUMN_XXXX in SQL_DESC_XXXX. Wenn FieldIdentifier SQL_DESC_CONCISE_TYPE ist und der Datentyp ein Datetime-Datentyp ist, ändern Sie den entsprechenden ODBC 3.x-Datentyp.

  • Wenn Sie Blockcursor, bildlauffähige Cursor oder beides verwenden, führt die Anwendung die folgenden Aktionen aus:

    • Legt die Zeilensatzgröße, den Cursortyp und die Cursorkoncurrität mithilfe von SQLSetStmtAttr fest.

    • Ruft SQLSetStmtAttr auf, um SQL_ATTR_ROW_STATUS_PTR auf ein Array von Statusdatensätzen zu verweisen.

    • Ruft SQLSetStmtAttr auf, um SQL_ATTR_ROWS_FETCHED_PTR auf einen SQLINTEGER zu verweisen.

    • Führt die erforderlichen Bindungen aus und führt die SQL-Anweisung aus.

    • Ruft SQLFetchScroll in einer Schleife auf, um Zeilen abzurufen und im Resultset herumzubewegen.

    • Wenn sie von einer Textmarke abgerufen werden soll, ruft die Anwendung SQLSetStmtAttr auf, um SQL_ATTR_FETCH_BOOKMARK_PTR auf eine Variable festzulegen, die die Textmarke für die Zeile enthält, die sie abrufen möchte, und ruft SQLFetchScroll mit einem FetchOrientation-Argument von SQL_FETCH_BOOKMARK auf.

  • Wenn Sie Arrays von Parametern verwenden, führt die Anwendung die folgenden Aktionen aus:

    • Ruft SQLSetStmtAttr auf, um das attribut SQL_ATTR_PARAMSET_SIZE auf die Größe des Parameterarrays festzulegen.

    • Ruft SQLSetStmtAttr auf, um SQL_ATTR_ROWS_PROCESSED_PTR auf eine interne UDWORD-Variable zu verweisen.

    • Führt nach Bedarf Vorbereitungs-, Bindungs- und Ausführungsvorgänge aus.

    • Wenn die Ausführung aus irgendeinem Grund angehalten wird (z. B. SQL_NEED_DATA), kann sie die "aktuelle" Zeile mit Parametern finden, indem sie die Position prüfen, auf die SQL_ATTR_ROWS_PROCESSED_PTR verweist.

In diesem Abschnitt werden die folgenden Themen behandelt: