Informasi ODBC 64-Bit

Dimulai dengan Windows Server 2003, sistem operasi Microsoft telah mendukung pustaka ODBC 64-bit. Header dan pustaka ODBC pertama kali dikirim dengan MDAC 2.7 SDK berisi perubahan untuk memungkinkan pemrogram menulis kode dengan mudah untuk platform 64 bit baru. Dengan memastikan bahwa kode Anda menggunakan jenis yang ditentukan ODBC yang tercantum di bawah ini, Anda dapat mengkompilasi kode sumber yang sama baik untuk platform 64-bit dan 32-bit berdasarkan makro _WIN64 atau WIN32 .

Ada beberapa poin yang perlu diingat ketika pemrograman untuk prosesor 64-bit:

  • Meskipun ukuran pointer telah berubah dari 4 byte menjadi 8 byte, bilangan bulat dan panjang masih 4 nilai byte. Jenis INT64 dan UINT64 telah ditentukan untuk 8 bilangan bulat byte. Jenis ODBC baru SQLLEN dan SQLULEN didefinisikan dalam file header ODBC sebagai INT64 dan UINT64 ketika _WIN64 telah ditentukan.

  • Beberapa fungsi dalam ODBC dinyatakan sebagai mengambil parameter pointer. Dalam ODBC 32-bit, parameter yang didefinisikan sebagai pointer sering digunakan untuk meneruskan nilai bilangan bulat atau penunjuk ke buffer tergantung pada konteks panggilan. Ini, tentu saja, mungkin karena fakta bahwa pointer dan bilangan bulat memiliki ukuran yang sama. Di Windows 64-bit, ini tidak terjadi.

  • Beberapa fungsi ODBC yang sebelumnya didefinisikan dengan parameter SQLINTEGER dan SQLUINTEGER telah diubah jika sesuai untuk menggunakan typedefs SQLLEN dan SQLULEN baru. Perubahan ini tercantum di bagian berikutnya, Perubahan Deklarasi Fungsi.

  • Beberapa bidang deskriptor yang dapat diatur melalui berbagai fungsi SQLSet dan SQLGet telah diubah untuk mengakomodasi nilai 64-bit sementara yang lain masih bernilai 32-bit. Pastikan Anda menggunakan variabel berukuran yang sesuai saat mengatur dan mengambil bidang ini. Spesifik bidang deskriptor mana yang telah diubah tercantum di bawah Perubahan Deklarasi Fungsi.

Perubahan Deklarasi Fungsi

Tanda tangan fungsi berikut telah berubah untuk pemrograman 64-bit. Item dalam teks tebal adalah parameter spesifik yang berbeda.

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

Perubahan pada Jenis Data SQL

Empat jenis SQL berikut ini masih didukung hanya pada 32-bit; mereka tidak didefinisikan untuk kompilator 64-bit. Jenis-jenis ini tidak lagi digunakan untuk parameter apa pun di MDAC 2.7; penggunaan jenis ini akan menyebabkan kegagalan kompilator pada platform 64-bit.

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

Definisi SQLSETPOSIROW telah berubah untuk pengkompilasi 32-bit dan 64-bit:

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

Definisi SQLLEN dan SQLULEN telah berubah untuk pengkompilasi 64-bit:

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

Meskipun SQL_C_BOOKMARK tidak digunakan lagi di ODBC 3.0, untuk pengkompilasi 64-bit pada klien 2.0, nilai ini telah berubah:

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

Jenis BOOKMARK didefinisikan secara berbeda di header yang lebih baru:

typedef SQLULEN BOOKMARK;  

Nilai yang Dikembalikan dari Panggilan API ODBC Melalui Pointer

Panggilan fungsi ODBC berikut mengambil sebagai parameter input penunjuk ke buffer tempat data dikembalikan dari driver. Konteks dan arti data yang dikembalikan ditentukan oleh parameter input lain untuk fungsi tersebut. Dalam beberapa kasus, metode ini sekarang dapat mengembalikan nilai bilangan bulat 64-bit (bilangan bulat 8-byte) alih-alih nilai bilangan bulat 32-bit (4-byte) biasa. Kasus-kasus ini adalah sebagai berikut:

SQLColAttribute

Saat parameter FieldIdentifier memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam *NumericAttribute:

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

Ketika parameter fDescType memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam *pfDesc:

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

SQLGetConnectAttr

Saat parameter Atribut memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam Nilai:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLGetConnectOption

Saat parameter Atribut memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam Nilai:

SQL_ATTR_QUIET_MODE

SQLGetDescField

Saat parameter FieldIdentifier memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam *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

Ketika parameter DiagIdentifier memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam *DiagInfoPtr:

SQL_DIAG_CURSOR_ROW_COUNT

SQL_DIAG_ROW_COUNT

SQL_DIAG_ROW_NUMBER

SQLGetInfo

Saat parameter InfoType memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam *InfoValuePtr:

SQL_DRIVER_HDBC

SQL_DRIVER_HENV

SQL_DRIVER_HLIB

Ketika InfoType memiliki salah satu dari 2 nilai berikut *InfoValuePtr adalah 64-bit pada input dan output:

SQL_DRIVER_HDESC

SQL_DRIVER_HSTMT

SQLGetStmtAttr

Ketika parameter Atribut memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam *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

Saat parameter Opsi memiliki salah satu nilai berikut, nilai 64-bit dikembalikan dalam *Nilai:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

SQLSetConnectAttr

Saat parameter Atribut memiliki salah satu nilai berikut, nilai 64-bit diteruskan dalam Nilai:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLSetConnectOption

Saat parameter Atribut memiliki salah satu nilai berikut, nilai 64-bit diteruskan dalam Nilai:

SQL_ATTR_QUIET_MODE

SQLSetDescField

Saat parameter FieldIdentifier memiliki salah satu nilai berikut, nilai 64-bit diteruskan dalam 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

Ketika parameter Atribut memiliki salah satu nilai berikut, nilai 64-bit diteruskan dalam 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

Saat parameter Opsi memiliki salah satu nilai berikut, nilai 64-bit diteruskan dalam Nilai:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

Lihat juga

Pengantar ODBC