Udostępnij przez


Informacje 64-bitowe ODBC

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

Zobacz też

Wprowadzenie do ODBC