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

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » ODBC-Unterstützung

 

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 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 (dokumentierter Parametername)
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 "ODBC 64-Bit API Changes in MDAC 2.7" unter [external link] http://support.microsoft.com/kb/298678.