ODBC 64 Bit Bilgileri

Microsoft işletim sistemleri, Windows Server 2003'le başlayarak 64 bit ODBC kitaplıklarını desteklemıştır. İlk olarak MDAC 2.7 SDK'sı ile birlikte gönderilen ODBC üst bilgileri ve kitaplıkları, programcıların yeni 64 bit platformlar için kolayca kod yazmasına olanak sağlayan değişiklikler içerir. Kodunuzun aşağıda listelenen ODBC tanımlı türleri kullandığından emin olarak, _WIN64 veyaWIN32 makrolarını temel alarak hem 64 bit hem de 32 bit platformlar için aynı kaynak kodunu derleyebilirsiniz.

64 bit işlemci için programlama yaparken göz önünde bulundurmanız gereken birkaç nokta vardır:

  • İşaretçinin boyutu 4 bayttan 8 bayta değişse de, tamsayılar ve uzunlar yine de 4 bayt değerdir. INT64 ve UINT64 türleri 8 bayt tamsayı için tanımlanmıştır. YENI ODBC türleri SQLLEN ve SQLULEN, _WIN64 tanımlandığında ODBC üst bilgi dosyasında INT64 ve UINT64 olarak tanımlanır.

  • ODBC'deki birkaç işlev, işaretçi parametresi alma olarak bildirilir. 32 bit ODBC'de, işaretçi olarak tanımlanan parametreler, çağrının bağlamlarına bağlı olarak bir tamsayı değeri veya işaretçiyi arabelleğe geçirmek için sık sık kullanılırdı. İşaretçilerin ve tamsayıların aynı boyuta sahip olması nedeniyle bu elbette mümkündü. 64 bit Windows'ta bu durum geçerli değildir.

  • Daha önce SQLINTEGER ve SQLUINTEGER parametreleriyle tanımlanan bazı ODBC işlevleri, yeni SQLLEN ve SQLULEN tür tanımlarını kullanmak için uygun yerlerde değiştirilmiştir. Bu değişiklikler, sonraki işlev bildirimi değişiklikleri bölümünde listelenmiştir.

  • Çeşitli SQLSet ve SQLGet işlevleri aracılığıyla ayarlanabilen tanımlayıcı alanlarından bazıları 64 bit değerleri barındıracak şekilde değiştirilirken, diğerleri hala 32 bit değerlerdir. Bu alanları ayarlarken ve alırken uygun boyutlu değişkeni kullandığınızdan emin olun. Tanımlayıcı alanlarının değiştirildiği özellikler İşlev Bildirimi Değişiklikleri altında listelenir.

İşlev Bildirimi Değişiklikleri

64 bit programlama için aşağıdaki işlev imzaları değişti. Kalın metindeki öğeler, farklı olan belirli parametrelerdir.

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 Veri Türlerindeki Değişiklikler

Aşağıdaki dört SQL türü yalnızca 32 bit üzerinde desteklenmektedir; bunlar 64 bit derleyiciler için tanımlanmamıştır. Bu türler artık MDAC 2.7'deki parametreler için kullanılmaz; bu türlerin kullanılması 64 bit platformlarda derleyici hatalarına neden olur.

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

SQLSETPOSIROW'un tanımı hem 32 bit hem de 64 bit derleyiciler için değişti:

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

64 bit derleyiciler için SQLLEN ve SQLULEN tanımları değişti:

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

ODBC 3.0'da SQL_C_BOOKMARK kullanımdan kaldırılmış olsa da, 2.0 istemcilerindeki 64 bit derleyiciler için bu değer değişmiştir:

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

BOOKMARK türü yeni üst bilgilerde farklı tanımlandı.

typedef SQLULEN BOOKMARK;  

İşaretçiler Aracılığıyla ODBC API Çağrılarından Döndürülen Değerler

Aşağıdaki ODBC işlev çağrıları, sürücüden veri döndürülen arabelleğe yönelik bir işaretçiyi giriş parametresi olarak alır. Döndürülen verilerin bağlamı ve anlamı, işlevler için diğer giriş parametreleri tarafından belirlenir. Bazı durumlarda, bu yöntemler artık tipik 32 bit (4 bayt) tamsayı değerleri yerine 64 bit (8 baytlık tamsayı) değerler döndürebilir. Bu durumlar aşağıdaki gibidir:

Sqlcolattribute

FieldIdentifier parametresi aşağıdaki değerlerden birine sahip olduğunda, *NumericAttribute içinde 64 bitlik bir değer döndürülür:

SQL_DESC_AUTO_UNIQUE_VALUE

SQL_DESC_DOSYA_DUYARLILIĞI

SQL_DESC_KISA_TİP

SQL_DESC_COUNT

SQL_DESC_DISPLAY_SIZE

SQL_DESC_FIXED_PREC_SCALE

SQL_DESC_LENGTH

SQL_DESC_NULLABLE (SQL Tanımlayıcı Boş Olabilirliği)

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 parametresi aşağıdaki değerlerden birine sahip olduğunda * pfDesc içinde 64 bitlik bir değer döndürülür:

SQL_COLUMN_COUNT

SQL_COLUMN_DISPLAY_SIZE

SQL_SUTUN_UZUNLUĞU

SQL_DESC_AUTO_UNIQUE_VALUE

SQL_DESC_DOSYA_DUYARLILIĞI

SQL_DESC_KISA_TİP

SQL_DESC_FIXED_PREC_SCALE

SQL_DESC_SEARCHABLE

SQL_DESC_UNSIGNED

SQL_DESC_UPDATABLE

Sqlgetconnectattr

Öznitelik parametresi aşağıdaki değerlerden birine sahip olduğunda, Değer'de 64 bitlik bir değer döndürülür:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLGetConnectOption

Öznitelik parametresi aşağıdaki değerlerden birine sahip olduğunda, Değer'de 64 bitlik bir değer döndürülür:

SQL_ATTR_QUIET_MODE

Sqlgetdescfield

FieldIdentifier parametresi aşağıdaki değerlerden birine sahip olduğunda * ValuePtr içinde 64 bitlik bir değer döndürülür:

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 parametresi aşağıdaki değerlerden birine sahip olduğunda, *DiagInfoPtr içinde 64 bit değer döndürülür:

SQL_DIAG_CURSOR_ROW_COUNT

SQL_DIAG_ROW_COUNT (SQL Tanı Satır Sayısı)

SQL_DIAG_ROW_NUMBER

Sqlgetınfo

InfoType parametresi aşağıdaki değerlerden birine sahip olduğunda, *InfoValuePtr içinde 64 bitlik bir değer döndürülür:

SQL_DRIVER_HDBC

SQL_DRIVER_HENV

SQL_DRIVER_HLIB

InfoType'da aşağıdaki 2 değerden biri olduğunda *InfoValuePtr hem giriş hem de çıkışta 64 bittir:

SQL_DRIVER_HDESC

SQL_DRIVER_HSTMT

SQLGetStmtAttr

Öznitelik parametresi aşağıdaki değerlerden birine sahip olduğunda, *ValuePtr içinde 64 bitlik bir değer döndürülür:

SQL_ATTR_APP_PARAM_DESC

SQL_ATTR_APP_ROW_DESC

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_CONCURRENCY

SQL_ATTR_CURSOR_SCROLLABLE

SQL_ATTR_CURSOR_DUYARLILIK

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 (sorgu zaman aşımı)

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 parametresi aşağıdaki değerlerden birine sahip olduğunda, *Değer içinde 64 bit değer döndürülür:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

SQLSetConnectAttr

Öznitelik parametresi aşağıdaki değerlerden birine sahip olduğunda, Değer'de 64 bitlik bir değer geçirilir:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLSetConnectOption

Öznitelik parametresi aşağıdaki değerlerden birine sahip olduğunda, Değer'de 64 bitlik bir değer geçirilir:

SQL_ATTR_QUIET_MODE

SQLSetDescField

FieldIdentifier parametresi aşağıdaki değerlerden birine sahip olduğunda, ValuePtr'de 64 bitlik bir değer geçirilir:

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

Öznitelik parametresi aşağıdaki değerlerden birine sahip olduğunda, ValuePtr'de 64 bitlik bir değer geçirilir:

SQL_ATTR_APP_PARAM_DESC

SQL_ATTR_APP_ROW_DESC

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_CONCURRENCY

SQL_ATTR_CURSOR_SCROLLABLE

SQL_ATTR_CURSOR_DUYARLILIK

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 (sorgu zaman aşımı)

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 parametresi aşağıdaki değerlerden birine sahip olduğunda, Değer'de 64 bitlik bir değer geçirilir:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

Ayrıca Bkz.

ODBC'ye giriş