64bitové informace o rozhraní ODBC

Od systému Windows Server 2003 operační systémy Microsoft podporují 64bitové knihovny ODBC. Hlavičky a knihovny ODBC, které byly poprvé dodávány se sadou MDAC 2.7 SDK, obsahují změny, které programátorům umožňují snadno psát kód pro nové 64bitové platformy. Tím, že kód použije níže uvedené definované typy ODBC, můžete zkompilovat stejný zdrojový kód pro 64bitové i 32bitové platformy založené na makrech _WIN64 nebo WIN32 .

Při programování pro 64bitový procesor je potřeba mít na paměti několik bodů:

  • I když se velikost ukazatele změnila ze 4 bajtů na 8 bajtů, celá čísla a dlouhé hodnoty jsou stále 4 bajtové hodnoty. Typy INT64 a UINT64 byly definovány pro 8 bajtů celých čísel. Nové typy ODBC SQLLEN a SQLULEN jsou definovány v souboru hlaviček ODBC jako INT64 a UINT64 při definování _WIN64 .

  • Několik funkcí v rozhraní ODBC je deklarováno jako přebírání parametru ukazatele. V 32bitovém rozhraní ODBC se parametry definované jako ukazatele často používaly k předání celočíselné hodnoty nebo ukazatele do vyrovnávací paměti v závislosti na kontextu volání. To bylo samozřejmě možné kvůli skutečnosti, že ukazatele a celá čísla měly stejnou velikost. V 64bitovém systému Windows tomu tak není.

  • Některé funkce ODBC, které byly dříve definovány pomocí parametrů SQLINTEGER a SQLUINTEGER , byly změněny tam, kde je to vhodné, aby používaly nové definice typů SQLLEN a SQLULEN . Tyto změny jsou uvedeny v další části Změny deklarace funkce.

  • Některá pole popisovače, která lze nastavit prostřednictvím různých funkcí SQLSet a SQLGet , byla změněna tak, aby vyhovovala 64bitovým hodnotám, zatímco jiné jsou stále 32bitové hodnoty. Ujistěte se, že při nastavování a načítání těchto polí používáte odpovídající proměnnou velikosti. Specifika polí popisovače, která se změnila, jsou uvedena v části Změny deklarace funkce.

Změny deklarace funkce

Následující podpisy funkcí se změnily pro 64bitové programování. Položky v tučném textu jsou specifické parametry, které se liší.

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);  

Změny datových typů SQL

Následující čtyři typy SQL jsou stále podporovány pouze na 32bitové verzi; nejsou definovány pro 64bitové kompilátory. Tyto typy se už nepoužívají pro žádné parametry v MDAC 2.7; použití těchto typů způsobí selhání kompilátoru na 64bitových platformách.

#ifdef WIN32   
typedef SQLULEN SQLROWCOUNT;   
typedef SQLULEN SQLROWSETSIZE;   
typedef SQLULEN SQLTRANSID;   
typedef SQLLEN SQLROWOFFSET;   
#endif  

Definice SQLSETPOSIROW se změnila pro 32bitové i 64bitové kompilátory:

#ifdef _WIN64   
typedef UINT64 SQLSETPOSIROW;   
#else   
#define SQLSETPOSIROW SQLUSMALLINT   
#endif  

Definice SQLLEN a SQLULEN se změnily pro 64bitové kompilátory:

#ifdef _WIN64   
typedef INT64 SQLLEN;   
typedef UINT64 SQLULEN;   
#else   
#define SQLLEN SQLINTEGER   
#define SQLULEN SQLUINTEGER   
#endif  

I když SQL_C_BOOKMARK je v rozhraní ODBC 3.0 zastaralé, u 64bitových kompilátorů na klientech 2.0 se tato hodnota změnila:

#ifdef _WIN64   
#define SQL_C_BOOKMARK SQL_C_UBIGINT   
#else   
#define SQL_C_BOOKMARK SQL_C_ULONG   
#endif  

Typ BOOKMARK se v novějších hlavičkách definuje jinak:

typedef SQLULEN BOOKMARK;  

Hodnoty vrácené z volání rozhraní API ODBC prostřednictvím ukazatelů

Následující volání funkce ODBC přebírají jako vstupní parametr ukazatel na vyrovnávací paměť, ve které se data vrací z ovladače. Kontext a význam vrácených dat jsou určeny jinými vstupními parametry pro funkce. V některých případech mohou tyto metody vrátit 64bitové (8 bajtové celé číslo) místo typických 32bitových (4bajtů) celočíselné hodnoty. Tyto případy jsou následující:

Sqlcolattribute

Pokud má parametr FieldIdentifier jednu z následujících hodnot, vrátí se 64bitová hodnota v *NumericAttribute:

SQL_DESC_AUTO_UNIQUE_VALUE

SQL_DESC_ROZLIŠUJE_VELIKOST_PÍSMEN

SQL_DESC_CONCISE_TYPE

SQL_DESC_COUNT

SQL_DESC_DISPLAY_SIZE

SQL_DESC_FIXED_PREC_SCALE

SQL_DESC_LENGTH

SQL_DESC_NULLABLE (Určuje, zda může být hodnota sloupce NULL)

SQL_DESC_NUM_PREC_RADIX

SQL_DESC_OCTET_LENGTH

SQL_DESC_PRECISION

SQL_DESC_SCALE

SQL_DESC_SEARCHABLE

SQL_DESC_TYPE

SQL_DESC_UNNAMED

SQL_DESC_UNSIGNED

SQL_DESC_UPDATABLE

SQLColAttributes

Pokud má parametr fDescType jednu z následujících hodnot, vrátí se v *pfDesc 64bitová hodnota:

SQL_COLUMN_COUNT

SQL_COLUMN_DISPLAY_SIZE

SQL_COLUMN_LENGTH

SQL_DESC_AUTO_UNIQUE_VALUE

SQL_DESC_ROZLIŠUJE_VELIKOST_PÍSMEN

SQL_DESC_CONCISE_TYPE

SQL_DESC_FIXED_PREC_SCALE

SQL_DESC_SEARCHABLE

SQL_DESC_UNSIGNED

SQL_DESC_UPDATABLE

SQLGetConnectAttr

Pokud má parametr Attribute jednu z následujících hodnot, vrátí se 64bitová hodnota v hodnotě:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLGetConnectOption

Pokud má parametr Attribute jednu z následujících hodnot, vrátí se 64bitová hodnota v hodnotě:

SQL_ATTR_QUIET_MODE

Sqlgetdescfield

Pokud má parametr FieldIdentifier jednu z následujících hodnot, vrátí se 64bitová hodnota v *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

Pokud má parametr DiagIdentifier jednu z následujících hodnot, vrátí se 64bitová hodnota v *DiagInfoPtr:

SQL_DIAG_CURSOR_ROW_COUNT

SQL_DIAG_ROW_COUNT

SQL_DIAG_ROW_NUMBER

Sqlgetinfo

Pokud má parametr InfoType jednu z následujících hodnot, vrátí se 64bitová hodnota v *InfoValuePtr:

SQL_DRIVER_HDBC

SQL_DRIVER_HENV

SQL_DRIVER_HLIB

Pokud má InfoType jednu z následujících 2 hodnot *InfoValuePtr je 64 bitů na vstupu i výstupu:

SQL_DRIVER_HDESC

SQL_DRIVER_HSTMT

SQLGetStmtAttr

Pokud má parametr Attribute jednu z následujících hodnot, vrátí se 64bitová hodnota v *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

Pokud má parametr Option jednu z následujících hodnot, vrátí se 64bitová hodnota v *Value:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

SQLSetConnectAttr

Pokud má parametr Attribute jednu z následujících hodnot, předá se 64bitová hodnota v hodnotě:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLSetConnectOption

Pokud má parametr Attribute jednu z následujících hodnot, předá se 64bitová hodnota v hodnotě:

SQL_ATTR_QUIET_MODE

SQLSetDescField

Pokud má parametr FieldIdentifier jednu z následujících hodnot, předá se 64bitová hodnota v 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

Pokud má parametr Attribute jednu z následujících hodnot, předá se 64bitová hodnota v 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

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

Pokud má parametr Option jednu z následujících hodnot, předá se 64bitová hodnota v hodnotě:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

Viz také

Úvod do rozhraní ODBC