Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od systemu Windows Server 2003, systemy operacyjne Firmy Microsoft obsługują 64-bitowe biblioteki ODBC. Nagłówki i biblioteki ODBC po raz pierwszy dostarczane z zestawem MDAC 2.7 SDK zawierają zmiany, aby umożliwić programistom łatwe pisanie kodu dla nowych platform 64-bitowych. Dzięki upewnieniu się, że kod używa zdefiniowanych typów ODBC wymienionych poniżej, można skompilować ten sam kod źródłowy zarówno dla platform 64-bitowych, jak i 32-bitowych na podstawie makr _WIN64 lub WIN32 .
Podczas programowania dla 64-bitowego procesora należy pamiętać o kilku kwestiach:
Chociaż rozmiar wskaźnika zmienił się z 4 bajtów na 8 bajtów, liczby typu int i long nadal mają 4 bajty. Typy INT64 i UINT64 zostały zdefiniowane dla 8 bajtowych liczb całkowitych. Nowe typy ODBC SQLLEN i SQLULEN są zdefiniowane w pliku nagłówka ODBC jako INT64 i UINT64 po zdefiniowaniu _WIN64 .
Kilka funkcji w ODBC przyjmuje wskaźnik jako parametr. W 32-bitowym ODBC parametry zdefiniowane jako wskaźniki były często używane do przekazywania wartości całkowitej lub wskaźnika do buforu w zależności od kontekstu wywołania. Było to oczywiście możliwe ze względu na to, że wskaźniki i liczby całkowite miały ten sam rozmiar. W 64-bitowym systemie Windows tak nie jest.
Niektóre funkcje ODBC, które zostały wcześniej zdefiniowane za pomocą parametrów SQLINTEGER i SQLUINTEGER , zostały zmienione w odpowiednim miejscu, aby używać nowych definicji typów SQLLEN i SQLULEN . Te zmiany są wymienione w następnej sekcji Zmiany deklaracji funkcji.
Niektóre pola deskryptora, które można ustawić za pomocą różnych funkcji SQLSet i SQLGet , zostały zmienione w celu uwzględnienia wartości 64-bitowych, podczas gdy inne są nadal wartościami 32-bitowymi. Upewnij się, że używasz odpowiedniej zmiennej o rozmiarze podczas ustawiania i pobierania tych pól. Szczegółowe informacje o tym, które pola deskryptora zostały zmienione, są wymienione w obszarze Zmiany deklaracji funkcji.
Zmiany deklaracji funkcji
Następujące podpisy funkcji zostały zmienione na potrzeby programowania 64-bitowego. Elementy w tekście pogrubionym to parametry, które się różnią.
SQLBindCol (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN * StrLen_or_Ind);
SQLBindParam (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT ValueType, SQLSMALLINT ParameterType,
SQLULEN ColumnSize, SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr, SQLLEN *StrLen_or_Ind);
SQLBindParameter (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputOutputType, SQLSMALLINT ValueType,
SQLSMALLINT ParameterType, SQLULEN ColumnSize, SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_IndPtr);
SQLColAttribute (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength, SQLSMALLINT * StringLengthPtr,
SQLLEN* NumericAttributePtr)
SQLColAttributes (SQLHSTMT hstmt, SQLUSMALLINT icol,
SQLUSMALLINT fDescType, SQLPOINTER rgbDesc,
SQLSMALLINT cbDescMax, SQLSMALLINT *pcbDesc, SQLLEN * pfDesc);
SQLDescribeCol (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLCHAR *ColumnName, SQLSMALLINT BufferLength,
SQLSMALLINT *NameLengthPtr, SQLSMALLINT *DataTypePtr, SQLULEN *ColumnSizePtr,
SQLSMALLINT *DecimalDigitsPtr, SQLSMALLINT *NullablePtr);
SQLDescribeParam (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT *DataTypePtr, SQLULEN *ParameterSizePtr, SQLSMALLINT *DecimalDigitsPtr,
SQLSMALLINT *NullablePtr);
SQLExtendedFetch(SQLHSTMT StatementHandle, SQLUSMALLINT FetchOrientation, SQLLEN FetchOffset,
SQLULEN * RowCountPtr, SQLUSMALLINT * RowStatusArray);
SQLFetchScroll (SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation,
SQLLEN FetchOffset);
SQLGetData (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind);
SQLGetDescRec (SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
SQLCHAR *Name, SQLSMALLINT BufferLength,
SQLSMALLINT *StringLengthPtr, SQLSMALLINT *TypePtr,
SQLSMALLINT *SubTypePtr, SQLLEN *LengthPtr,
SQLSMALLINT *PrecisionPtr, SQLSMALLINT *ScalePtr,
SQLSMALLINT *NullablePtr);
SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN * pirow);
SQLPutData (SQLHSTMT StatementHandle, SQLPOINTER DataPtr,
SQLLEN StrLen_or_Ind);
SQLRowCount (SQLHSTMT StatementHandle, SQLLEN* RowCountPtr);
SQLSetConnectOption(SQLHDBC ConnectHandle, SQLUSMALLINT Option,
SQLULEN Value);
SQLSetPos (SQLHSTMT StatementHandle, SQLSETPOSIROW RowNumber, SQLUSMALLINT Operation,
SQLUSMALLINT LockType);
SQLSetParam (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT ValueType, SQLSMALLINT ParameterType,
SQLULEN LengthPrecision, SQLSMALLINT ParameterScale,
SQLPOINTER ParameterValue, SQLLEN *StrLen_or_Ind);
SQLSetDescRec (SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
SQLSMALLINT Type, SQLSMALLINT SubType, SQLLEN Length,
SQLSMALLINT Precision, SQLSMALLINT Scale, SQLPOINTER DataPtr,
SQLLEN *StringLengthPtr, SQLLEN *IndicatorPtr);
SQLSetScrollOptions (SQLHSTMT hstmt, SQLUSMALLINT fConcurrency,
SQLLEN crowKeyset, SQLUSMALLINT crowRowset);
SQLSetStmtOption (SQLHSTMT StatementHandle, SQLUSMALLINT Option,
SQLULEN Value);
Zmiany w typach danych SQL
Następujące cztery typy SQL są nadal obsługiwane tylko w wersji 32-bitowej; nie są one zdefiniowane dla 64-bitowych kompilatorów. Te typy nie są już używane dla żadnych parametrów w usłudze MDAC 2.7; użycie tych typów spowoduje błędy kompilatora na platformach 64-bitowych.
#ifdef WIN32
typedef SQLULEN SQLROWCOUNT;
typedef SQLULEN SQLROWSETSIZE;
typedef SQLULEN SQLTRANSID;
typedef SQLLEN SQLROWOFFSET;
#endif
Definicja funkcji SQLSETPOSIROW została zmieniona zarówno dla kompilatorów 32-bitowych, jak i 64-bitowych:
#ifdef _WIN64
typedef UINT64 SQLSETPOSIROW;
#else
#define SQLSETPOSIROW SQLUSMALLINT
#endif
Definicje funkcji SQLLEN i SQLULEN zostały zmienione dla kompilatorów 64-bitowych:
#ifdef _WIN64
typedef INT64 SQLLEN;
typedef UINT64 SQLULEN;
#else
#define SQLLEN SQLINTEGER
#define SQLULEN SQLUINTEGER
#endif
Mimo że SQL_C_BOOKMARK jest przestarzały w wersji ODBC 3.0, dla 64-bitowych kompilatorów na klientach 2.0 ta wartość uległa zmianie:
#ifdef _WIN64
#define SQL_C_BOOKMARK SQL_C_UBIGINT
#else
#define SQL_C_BOOKMARK SQL_C_ULONG
#endif
Typ BOOKMARK jest zdefiniowany inaczej w nowszych nagłówkach:
typedef SQLULEN BOOKMARK;
Wartości zwracane z wywołań interfejsu API ODBC za pośrednictwem wskaźników
Następujące wywołania funkcji ODBC przyjmują jako parametr wejściowy wskaźnik do buforu, w którym dane są zwracane ze sterownika. Kontekst i znaczenie zwracanych danych są określane przez inne parametry wejściowe dla funkcji. W niektórych przypadkach te metody mogą teraz zwracać wartości 64-bitowe (liczba całkowita 8-bajtowa) zamiast typowych 32-bitowych (4-bajtowych) wartości całkowitych. Te przypadki są następujące:
Sqlcolattribute
Gdy parametr FieldIdentifier ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w *NumericAttribute:
SQL_DESC_AUTOMATYCZNA_UNIKALNA_WARTOŚĆ
SQL_DESC_CASE_SENSITIVE
SQL_DESC_CONCISE_TYPE
SQL_DESC_COUNT
SQL_DESC_DISPLAY_SIZE
SQL_DESC_FIXED_PREC_SCALE
SQL_DESC_LENGTH
SQL_DESC_NULLABLE
SQL_DESC_NUM_PREC_RADIX
SQL_DESC_OCTET_LENGTH
SQL_DESC_PRECISION
SQL_DESC_SCALE
SQL_DESC_WYSZUKIWALNE
SQL_DESC_TYPE
SQL_DESC_UNNAMED
SQL_DESC_UNSIGNED
SQL_DESC_UPDATABLE
SQLColAttributes
Gdy parametr fDescType ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w *pfDesc:
SQL_COLUMN_COUNT
SQL_COLUMN_DISPLAY_SIZE
SQL_COLUMN_LENGTH
SQL_DESC_AUTOMATYCZNA_UNIKALNA_WARTOŚĆ
SQL_DESC_CASE_SENSITIVE
SQL_DESC_CONCISE_TYPE
SQL_DESC_FIXED_PREC_SCALE
SQL_DESC_WYSZUKIWALNE
SQL_DESC_UNSIGNED
SQL_DESC_UPDATABLE
Sqlgetconnectattr
Gdy parametr Atrybut ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w wartości:
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_ENLIST_IN_DTC
SQL_ATTR_ODBC_CURSORS
SQL_ATTR_QUIET_MODE
SQLGetConnectOption
Gdy parametr Atrybut ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w wartości:
SQL_ATTR_QUIET_MODE
Sqlgetdescfield
Gdy parametr FieldIdentifier ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w *ValuePtr:
SQL_DESC_ARRAY_SIZE
SQL_DESC_ARRAY_STATUS_PTR
SQL_DESC_BIND_OFFSET_PTR
SQL_DESC_DATA_PTR
SQL_DESC_DISPLAY_SIZE
SQL_DESC_INDICATOR_PTR
SQL_DESC_LENGTH
SQL_DESC_OCTET_LENGTH
SQL_DESC_OCTET_LENGTH_PTR
SQL_DESC_ROWS_PROCESSED_PTR
Sqlgetdiagfield
Gdy parametr DiagIdentifier ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w *DiagInfoPtr:
SQL_DIAG_CURSOR_ROW_COUNT
SQL_DIAG_ROW_COUNT
SQL_DIAG_ROW_NUMBER
Sqlgetinfo
Gdy parametr InfoType ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w *InfoValuePtr:
SQL_DRIVER_HDBC
SQL_DRIVER_HENV
SQL_DRIVER_HLIB
Jeśli parametr InfoType ma jedną z następujących 2 wartości *InfoValuePtr jest 64-bitowa dla danych wejściowych i wyjściowych:
SQL_DRIVER_HDESC
SQL_DRIVER_HSTMT
SQLGetStmtAttr
Gdy parametr Atrybut ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w *ValuePtr:
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_CONCURRENCY
SQL_ATTR_CURSOR_SCROLLABLE
SQL_ATTR_CURSOR_SENSITIVITY
SQL_ATTR_CURSOR_TYPE
SQL_ATTR_ENABLE_AUTO_IPD
SQL_ATTR_FETCH_BOOKMARK_PTR
SQL_ATTR_ROWS_FETCHED_PTR
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_KEYSET_SIZE
SQL_ATTR_MAX_LENGTH
SQL_ATTR_MAX_ROWS
SQL_ATTR_METADATA_ID
SQL_ATTR_NOSCAN
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PARAM_OPERATION_PTR
SQL_ATTR_PARAM_STATUS_PTR
SQL_ATTR_PARAMS_PROCESSED_PTR
SQL_ATTR_PARAMSET_SIZE
SQL_ATTR_QUERY_TIMEOUT
SQL_ATTR_RETRIEVE_DATA
SQL_ATTR_ROW_ARRAY_SIZE
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_NUMBER
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_ROW_STATUS_PTR
SQL_ATTR_SIMULATE_CURSOR
SQL_ATTR_USE_BOOKMARKS
SQLGetStmtOption
Jeśli parametr Opcja ma jedną z następujących wartości, wartość 64-bitowa jest zwracana w *Wartość:
SQL_KEYSET_SIZE
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE
SQLSetConnectAttr
Gdy parametr Attribute ma jedną z następujących wartości, wartość 64-bitowa jest przekazywana w wartości:
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_ENLIST_IN_DTC
SQL_ATTR_ODBC_CURSORS
SQL_ATTR_QUIET_MODE
SQLSetConnectOption
Gdy parametr Attribute ma jedną z następujących wartości, wartość 64-bitowa jest przekazywana w wartości:
SQL_ATTR_QUIET_MODE
SQLSetDescField
Gdy parametr FieldIdentifier ma jedną z następujących wartości, wartość 64-bitowa jest przekazywana w funkcji ValuePtr:
SQL_DESC_ARRAY_SIZE
SQL_DESC_ARRAY_STATUS_PTR
SQL_DESC_BIND_OFFSET_PTR
SQL_DESC_DATA_PTR
SQL_DESC_DISPLAY_SIZE
SQL_DESC_INDICATOR_PTR
SQL_DESC_LENGTH
SQL_DESC_OCTET_LENGTH
SQL_DESC_OCTET_LENGTH_PTR
SQL_DESC_ROWS_PROCESSED_PTR
SQLSetStmtAttr
Gdy parametr Attribute ma jedną z następujących wartości, wartość 64-bitowa jest przekazywana w valuePtr:
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_CONCURRENCY
SQL_ATTR_CURSOR_SCROLLABLE
SQL_ATTR_CURSOR_SENSITIVITY
SQL_ATTR_CURSOR_TYPE
SQL_ATTR_ENABLE_AUTO_IPD
SQL_ATTR_FETCH_BOOKMARK_PTR
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_KEYSET_SIZE
SQL_ATTR_MAX_LENGTH
SQL_ATTR_MAX_ROWS
SQL_ATTR_METADATA_ID
SQL_ATTR_NOSCAN
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PARAM_OPERATION_PTR
SQL_ATTR_PARAM_STATUS_PTR (wskaźnik na stan parametru)
SQL_ATTR_PARAMS_PROCESSED_PTR
SQL_ATTR_PARAMSET_SIZE
SQL_ATTR_QUERY_TIMEOUT
SQL_ATTR_RETRIEVE_DATA
SQL_ATTR_ROW_ARRAY_SIZE
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_NUMBER
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_ROW_STATUS_PTR
SQL_ATTR_ROWS_FETCHED_PTR
SQL_ATTR_SIMULATE_CURSOR
SQL_ATTR_USE_BOOKMARKS
SQLSetStmtOption
Jeśli parametr Opcja ma jedną z następujących wartości, wartość 64-bitowa jest przekazywana w wartości:
SQL_KEYSET_SIZE
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE