Wenn Sie eine ODBC-Funktion wie SQLBindCol, SQLBindParameter oder SQLGetData verwenden, werden einige Parameter als SQLLEN oder SQLULEN im Funktionsprototyp typisiert. Abhängig vom Erscheinungsdatum Ihrer Microsoft-ODBC-API-Referenzdokumentation kann derselbe Parameter als SQLINTEGER oder SQLUINTEGER beschrieben sein.
SQLLEN- und SQLULEN-Datenelemente sind 64 Bit in einer 64-Bit-ODBC-Anwendung und 32 Bit in einer 32-Bit-ODBC-Anwendung. SQLINTEGER- und SQLUINTEGER-Datenelemente sind 32 Bit auf allen Plattformen.
Um das Problem zu illustrieren, wurde der folgende ODBC-Funktionsprototyp einer älteren Ausgabe der Microsoft-ODBC-API-Referenz entnommen.
SQLRETURN SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLINTEGER *StrLen_or_IndPtr); |
Vergleichen Sie dies mit dem Funktionsprototyp, wie er in sql.h in Microsoft Visual Studio Version 8 zu finden ist.
SQLRETURN SQL_API SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind); |
Wie Sie sehen, werden die Parameter BufferLength und StrLen_or_Ind nun als SQLLEN und nicht als SQLINTEGER typisiert. Bei der 64-Bit-Plattform sind sie 64-Bit-Quantitäten und keine 32-Bit-Quantitäten, wie dies in der Microsoft-Dokumentation angegeben ist.
Um Probleme bei plattformübergreifenden Kompilierungen zu vermeiden, stellt SQL Anywhere eigene ODBC-Header-Dateien zur Verfügung. Bei Windows-Plattformen sollten Sie die ntodbc.h-Header-Datei aufnehmen. Bei Unix-Plattformen wie Linux sollten Sie die unixodbc.h-Header-Datei aufnehmen. Die Verwendung dieser Header-Dateien gewährleistet Kompatibilität mit dem entsprechenden SQL Anywhere ODBC-Treiber für die Zielplattform.
Die folgende Tabelle listet einige gebräuchliche ODBC-Typen auf, die dieselben bzw. verschiedene Speichergrößen auf 64-Bit- und 32-Bit-Plattformen haben.
ODBC-API | 64-Bit-Plattform | 32-Bit-Plattform |
---|---|---|
SQLINTEGER | 32 Bit | 32 Bit |
SQLUINTEGER | 32 Bit | 32 Bit |
SQLLEN | 64 Bit | 32 Bit |
SQLULEN | 64 Bit | 32 Bit |
SQLSETPOSIROW | 64 Bit | 16 Bit |
SQL_C_BOOKMARK | 64 Bit | 32 Bit |
BOOKMARK | 64 Bit | 32 Bit |
Wenn Sie Datenvariablen und Parameter nicht korrekt deklarieren, kann das zu fehlerhaftem Software-Verhalten führen.
Die folgende Tabelle fasst die Funktionsprototypen der ODBC-API zusammen, die sich mit Einführung der 64-Bit-Unterstützung geändert haben. Die betroffenen Parameter werden aufgelistet. Der in Microsoft-Dokumentationen verwendete Parametername wird in Klammern angeführt, wenn er sich vom Parameternamen im Funktionsprototyp unterscheidet. Die Parameternamen sind die, die in den Microsoft Visual Studio Version 8-Header-Dateien verwendet werden.
ODBC-API | Parameter (Parametername in Dokumentationen) |
---|---|
SQLBindCol |
SQLLEN BufferLength SQLLEN *Strlen_or_Ind |
SQLBindParam |
SQLULEN LengthPrecision SQLLEN *Strlen_or_Ind |
SQLBindParameter |
SQLULEN cbColDef (ColumnSize) SQLLEN cbValueMax (BufferLength) SQLLEN *pcbValue (Strlen_or_IndPtr) |
SQLColAttribute |
SQLLEN *NumericAttribute |
SQLColAttributes |
SQLLEN *pfDesc |
SQLDescribeCol |
SQLULEN *ColumnSize (ColumnSizePtr) |
SQLDescribeParam |
SQLULEN *pcbParamDef (ParameterSizePtr) |
SQLExtendedFetch |
SQLLEN irow (FetchOffset) SQLULEN *pcrow (RowCountPtr) |
SQLFetchScroll |
SQLLEN FetchOffset |
SQLGetData |
SQLLEN BufferLength SQLLEN *Strlen_or_Ind (Strlen_or_IndPtr) |
SQLGetDescRec |
SQLLEN *Length (LengthPtr) |
SQLParamOptions |
SQLULEN crow, SQLULEN *pirow |
SQLPutData |
SQLLEN Strlen_or_Ind |
SQLRowCount |
SQLLEN *RowCount (RowCountPtr) |
SQLSetConnectOption |
SQLULEN Value |
SQLSetDescRec |
SQLLEN Length SQLLEN *StringLength (StringLengthPtr) SQLLEN *Indicator (IndicatorPtr) |
SQLSetParam |
SQLULEN LengthPrecision SQLLEN *Strlen_or_Ind (Strlen_or_IndPtr) |
SQLSetPos |
SQLSETPOSIROW irow (RowNumber) |
SQLSetScrollOptions |
SQLLEN crowKeyset |
SQLSetStmtOption |
SQLULEN Value |
Manche Werte, die von ODBC-API-Aufrufen übergeben und über Zeiger zurückgegeben werden, haben sich geändert, um 64-Bit-Anwendungen zu entsprechen. Beispiel: Die folgenden Werte für die SQLSetStmtAttr- und SQLSetDescField-Funktionen sind nicht mehr SQLINTEGER/SQLUINTEGER. Die gleiche Regel gilt auch für die entsprechenden Parameter für die SQLGetStmtAttr- und SQLGetDescField-Funktionen.
ODBC-API | Typ für Value/ValuePtr-Variable |
---|---|
SQLSetStmtAttr(SQL_ATTR_FETCH_BOOKMARK_PTR) |
SQLLEN * Value |
SQLSetStmtAttr(SQL_ATTR_KEYSET_SIZE) |
SQLULEN Value |
SQLSetStmtAttr(SQL_ATTR_MAX_LENGTH) |
SQLULEN Value |
SQLSetStmtAttr(SQL_ATTR_MAX_ROWS) |
SQLULEN Value |
SQLSetStmtAttr(SQL_ATTR_PARAM_BIND_OFFSET_PTR) |
SQLULEN * Value |
SQLSetStmtAttr(SQL_ATTR_PARAMS_PROCESSED_PTR) |
SQLULEN * Value |
SQLSetStmtAttr(SQL_ATTR_PARAMSET_SIZE) |
SQLULEN Value |
SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE) |
SQLULEN Value |
SQLSetStmtAttr(SQL_ATTR_ROW_BIND_OFFSET_PTR) |
SQLULEN * Value |
SQLSetStmtAttr(SQL_ATTR_ROW_NUMBER) |
SQLULEN Value |
SQLSetStmtAttr(SQL_ATTR_ROWS_FETCHED_PTR) |
SQLULEN * Value |
SQLSetDescField(SQL_DESC_ARRAY_SIZE) |
SQLULEN Value |
SQLSetDescField(SQL_DESC_BIND_OFFSET_PTR) |
SQLLEN * Value |
SQLSetDescField(SQL_DESC_ROWS_PROCESSED_PTR) |
SQLULEN * Value |
SQLSetDescField(SQL_DESC_DISPLAY_SIZE) |
SQLLEN Value |
SQLSetDescField(SQL_DESC_INDICATOR_PTR) |
SQLLEN * Value |
SQLSetDescField(SQL_DESC_LENGTH) |
SQLLEN Value |
SQLSetDescField(SQL_DESC_OCTET_LENGTH) |
SQLLEN Value |
SQLSetDescField(SQL_DESC_OCTET_LENGTH_PTR) |
SQLLEN * Value |
Beachten·Sie,·dass·die·aktuelle·Microsoft-Dokumentation "ODBC API Reference" für SQLSetConnectAttr/SQLGetConnectAttr die nummerischen Attributwerte als SQLUINTEGER beschreibt. Beachten Sie, dass sich der Typ dieser Attributwerte von den Attributwerten für SQLSetStmtAttr/SQLGetStmtAttr unterscheidet, die als SQLULEN beschrieben werden.
Es gibt ein Verbindungsattribut, SQL_ATTR_ODBC_CURSORS, das vom Microsoft-ODBC-Treibermanager verarbeitet wird. Obwohl es sich laut der Microsoft-Dokumentation "ODBC API Reference" bei dem Attribut um einen SQLUINTEGER-Wert handelt, der angibt, wie der Treibermanager die ODBC-Cursorbibliothek verwendet, gibt die 64-Bit-Version des Treibermanagers einen 64-Bit-SQLULEN-Wert für SQLGetConnectAttr zurück.
__int64 datavalue = 0x1234567812345678; rc = SQLGetConnectAttr( hdbc, attr, &datavalue, 0, 0 ); |
Nach dem Aufruf von SQLGetConnectAttr hat datavalue
den Wert 0x0000000000000002
, der anzeigt, dass ein 64-Bit-Wert gespeichert ist. Achten Sie darauf, diesen Fehler im Microsoft-Treibermanager zu umgehen.
Andere Attributwerte werden vom SQL Anywhere-ODBC-Treiber verarbeitet, der SQLUINTEGER-Werte zurückgibt, wie in der Microsoft-Dokumentation
"ODBC API Reference" beschrieben.
Weitere Hinweise finden Sie im Microsoft-Artikel "ODBC 64-Bit API Changes in MDAC 2.7" unter http://support.microsoft.com/kb/298678.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |