ODBC 64비트 정보

Windows Server 2003부터 Microsoft 운영 체제는 64비트 ODBC 라이브러리를 지원했습니다. MDAC 2.7 SDK와 함께 처음 제공되는 ODBC 헤더 및 라이브러리에는 프로그래머가 새 64비트 플랫폼에 대한 코드를 쉽게 작성할 수 있도록 변경 내용이 포함되어 있습니다. 코드에서 아래에 나열된 ODBC 정의 형식을 사용하는지 확인하여 _WIN64 또는 WIN32 매크로를 기반으로 64비트 및 32비트 플랫폼에 대해 동일한 소스 코드를 컴파일할 수 있습니다.

64비트 프로세서를 프로그래밍할 때 유의해야 할 몇 가지 사항이 있습니다.

  • 포인터 크기가 4바이트에서 8바이트로 변경되었지만 정수와 long은 여전히 4바이트 값입니다. INT64UINT64 형식은 8 바이트 정수에 대해 정의되었습니다. 새 ODBC 형식 SQLLENSQLULEN은 _WIN64 정의된 경우 ODBC 헤더 파일에서 INT64UINT64정의됩니다.

  • ODBC의 여러 함수는 포인터 매개 변수를 사용하는 것으로 선언됩니다. 32비트 ODBC에서 포인터로 정의된 매개 변수는 호출 컨텍스트에 따라 정수 값 또는 포인터를 버퍼에 전달하는 데 자주 사용되었습니다. 물론 포인터와 정수의 크기가 같기 때문에 가능했습니다. 64비트 Windows에서는 그렇지 않습니다.

  • 이전에 SQLINTEGERSQLUINTEGER 매개 변수로 정의되었던 일부 ODBC 함수는 새 SQLLENSQLULEN typedefs를 사용하기 위해 적절하게 변경되었습니다. 이러한 변경 내용은 다음 섹션인 함수 선언 변경 내용에 나열됩니다.

  • 다양한 SQLSetSQLGet 함수를 통해 설정할 수 있는 설명자 필드 중 일부는 64비트 값을 수용하도록 변경되었지만 다른 설명자 필드는 여전히 32비트 값입니다. 이러한 필드를 설정하고 검색할 때 적절한 크기의 변수를 사용해야 합니다. 설명자 필드가 변경된 세부 정보는 함수 선언 변경 내용 아래에 나열됩니다.

함수 선언 변경 내용

64비트 프로그래밍에 대해 다음과 같은 함수 서명이 변경되었습니다. 굵게 표시된 텍스트의 항목은 서로 다른 특정 매개 변수입니다.

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

SQL 데이터 형식의 변경 내용

다음 4개의 SQL 형식은 32비트에서만 지원됩니다. 64비트 컴파일러에 대해 정의되지 않았습니다. 이러한 형식은 MDAC 2.7의 매개 변수에 더 이상 사용되지 않습니다. 이러한 형식을 사용하면 64비트 플랫폼에서 컴파일러 오류가 발생합니다.

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

32비트 및 64비트 컴파일러 모두에 대해 SQLSETPOSIROW의 정의가 변경되었습니다.

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

64비트 컴파일러에 대해 SQLLEN 및 SQLULEN의 정의가 변경되었습니다.

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

SQL_C_BOOKMARK ODBC 3.0에서는 사용되지 않지만 2.0 클라이언트의 64비트 컴파일러에서는 이 값이 변경되었습니다.

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

BOOKMARK 형식은 최신 헤더에서 다르게 정의됩니다.

typedef SQLULEN BOOKMARK;  

포인터를 통해 ODBC API 호출에서 반환된 값

다음 ODBC 함수 호출은 드라이버에서 데이터가 반환되는 버퍼에 대한 포인터를 입력 매개 변수로 사용합니다. 반환되는 데이터의 컨텍스트와 의미는 함수에 대한 다른 입력 매개 변수에 의해 결정됩니다. 경우에 따라 이러한 메서드는 일반적인 32비트(4 바이트) 정수 값 대신 64비트(8 바이트 정수) 값을 반환할 수 있습니다. 이러한 경우는 다음과 같습니다.

SQLColAttribute

FieldIdentifier 매개 변수에 다음 값 중 하나가 있으면 *NumericAttribute에서 64비트 값이 반환됩니다.

SQL_DESC_AUTO_UNIQUE_VALUE

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_SEARCHABLE

SQL_DESC_TYPE

SQL_DESC_UNNAMED

SQL_DESC_UNSIGNED

SQL_DESC_UPDATABLE

SQLColAttributes

fDescType 매개 변수에 다음 값 중 하나가 있으면 *pfDesc에서 64비트 값이 반환됩니다.

SQL_COLUMN_COUNT

SQL_COLUMN_DISPLAY_SIZE

SQL_COLUMN_LENGTH

SQL_DESC_AUTO_UNIQUE_VALUE

SQL_DESC_CASE_SENSITIVE

SQL_DESC_CONCISE_TYPE

SQL_DESC_FIXED_PREC_SCALE

SQL_DESC_SEARCHABLE

SQL_DESC_UNSIGNED

SQL_DESC_UPDATABLE

SQLGet커넥트Attr

Attribute 매개 변수에 다음 값 중 하나가 있으면 값에 64비트 값이 반환됩니다.

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLGet커넥트Option

Attribute 매개 변수에 다음 값 중 하나가 있으면 값에 64비트 값이 반환됩니다.

SQL_ATTR_QUIET_MODE

SQLGetDescField

FieldIdentifier 매개 변수에 다음 값 중 하나가 있으면 *ValuePtr에서 64비트 값이 반환됩니다.

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

DiagIdentifier 매개 변수에 다음 값 중 하나가 있으면 *DiagInfoPtr에서 64비트 값이 반환됩니다.

SQL_DIAG_CURSOR_ROW_COUNT

SQL_DIAG_ROW_COUNT

SQL_DIAG_ROW_NUMBER

Sqlgetinfo

InfoType 매개 변수에 다음 값 중 하나가 있으면 *InfoValuePtr에서 64비트 값이 반환됩니다.

SQL_DRIVER_HDBC

SQL_DRIVER_HENV

SQL_DRIVER_HLIB

InfoType에 다음 두 값 중 하나가 있는 경우 *InfoValuePtr는 입력 및 출력 모두에서 64비트입니다.

SQL_DRIVER_HDESC

SQL_DRIVER_HSTMT

SQLGetStmtAttr

Attribute 매개 변수에 다음 값 중 하나가 있으면 *ValuePtr에서 64비트 값이 반환됩니다.

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

Option 매개 변수에 다음 값 중 하나가 있으면 64비트 값이 *Value로 반환됩니다.

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

SQLSet커넥트Attr

Attribute 매개 변수에 다음 값 중 하나가 있으면 값에 64비트 값이 전달됩니다.

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLSet커넥트Option

Attribute 매개 변수에 다음 값 중 하나가 있으면 값에 64비트 값이 전달됩니다.

SQL_ATTR_QUIET_MODE

SQLSetDescField

FieldIdentifier 매개 변수에 다음 값 중 하나가 있으면 ValuePtr64비트 값이 전달됩니다.

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

Attribute 매개 변수에 다음 값 중 하나가 있으면 ValuePtr64비트 값이 전달됩니다.

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

Option 매개 변수에 다음 값 중 하나가 있으면 값에 64비트 값이 전달됩니다.

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

참고 항목

ODBC 소개