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

SQL Anywhere 12.0.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 (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.

Vorsicht

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 [external link] http://support.microsoft.com/kb/298678.