Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere ODBC-API

 

Hinweise zu 64-Bit-ODBC

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 Datenvariable und Parameter nicht korrekt deklarieren, kann das zu fehlerhaftem Software-Verhalten führen.

Die folgende Tabelle fasst die ODBC API-Funktionsprototypen zusammen, die sich seit der 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

Weitere Hinweise finden Sie im Microsoft-Artikel [external link] ODBC 64-Bit API Changes in MDAC 2.7.