ODBC 64비트 정보
Windows Server 2003부터 Microsoft 운영 체제는 64비트 ODBC 라이브러리를 지원했습니다. MDAC 2.7 SDK와 함께 처음 제공되는 ODBC 헤더 및 라이브러리에는 프로그래머가 새 64비트 플랫폼에 대한 코드를 쉽게 작성할 수 있도록 변경 내용이 포함되어 있습니다. 코드에서 아래에 나열된 ODBC 정의 형식을 사용하는지 확인하여 _WIN64 또는 WIN32 매크로를 기반으로 64비트 및 32비트 플랫폼에 대해 동일한 소스 코드를 컴파일할 수 있습니다.
64비트 프로세서를 프로그래밍할 때 유의해야 할 몇 가지 사항이 있습니다.
포인터 크기가 4바이트에서 8바이트로 변경되었지만 정수와 long은 여전히 4바이트 값입니다. INT64 및 UINT64 형식은 8 바이트 정수에 대해 정의되었습니다. 새 ODBC 형식 SQLLEN 및 SQLULEN은 _WIN64 정의된 경우 ODBC 헤더 파일에서 INT64 및 UINT64로 정의됩니다.
ODBC의 여러 함수는 포인터 매개 변수를 사용하는 것으로 선언됩니다. 32비트 ODBC에서 포인터로 정의된 매개 변수는 호출 컨텍스트에 따라 정수 값 또는 포인터를 버퍼에 전달하는 데 자주 사용되었습니다. 물론 포인터와 정수의 크기가 같기 때문에 가능했습니다. 64비트 Windows에서는 그렇지 않습니다.
이전에 SQLINTEGER 및 SQLUINTEGER 매개 변수로 정의되었던 일부 ODBC 함수는 새 SQLLEN 및 SQLULEN typedefs를 사용하기 위해 적절하게 변경되었습니다. 이러한 변경 내용은 다음 섹션인 함수 선언 변경 내용에 나열됩니다.
다양한 SQLSet 및 SQLGet 함수를 통해 설정할 수 있는 설명자 필드 중 일부는 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 매개 변수에 다음 값 중 하나가 있으면 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
SQLSetStmtAttr
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_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