文章編號: 298678 - 上次校閱: 2002年1月21日 - 版次: 1.0

資訊: 在 MDAC 2.7 ODBC 64 位元 API 變更

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
全部展開 | 全部摺疊

結論

開放式資料庫連接 (ODBC) 的標頭和 Microsoft 資料存取元件 (MDAC) 2.7 軟體開發套件 (SDK) 所隨附的程式庫包含從舊的版本,以允許新的 64 位元平台的程式碼的程式設計師的 ODBC 的某些變更。本文摘要說明這些變更。

其他相關資訊

藉由確保您的程式碼使用下面列出 ODBC 定義型別,您可以編譯您的程式碼,根據 _WIN64 或 WIN32 巨集的 64 位元和 32 位元平台。

有幾個點的特定重要:
  • 雖然指標的大小已經從 4 個位元組至 8 個位元組,整數和 longs 維持 4 位元組值。型別 INT64 和 UINT64 尚未定義為 8 位元組的整數。針對 64 位元編譯會,這些被轉換 SQLLEN 並 SQLULEN ODBC。在適當的地方,因此已變更 SQLINTEGER 和 SQLUINTEGER 參數使用先前定義的某些 ODBC 函式。這些情況下會列舉下方,以及 ODBC 自訂資料型別特定的變更。
  • 沒有在 ODBC 中宣告為採取指標參數的數個函數。在 32 位元 ODBC 該指標型別是經常用來將整數資料,以及指標傳遞至緩衝區依據呼叫的內容。這是可能的當然因為指標和整數有相同的長度 ; 這不是 64 位元 Windows 中的大小寫。
  • 某些描述元的欄位,可以設定且透過各種 SQLSet...和 SQLGet...擷取函式有經過變更為可容納 64 位元值當其他人仍為 32 位元值。請注意在呼叫這些方法,以確定您使用適當大小的緩衝區,在設定和擷取這些欄位中。已變更欄位的描述元的細節會列在本文最後一節。

SQL 資料型別中的變更

僅 32 位元上仍然支援下列四種 SQL 類型 ; 未定義為 64 位元編譯。這些型別不再使用的 MDAC 2.7 任何參數 ; 使用這些型別會造成編譯器失敗,在 64 位元平台上。
#ifdef WIN32
typedef SQLULEN SQLROWCOUNT;
typedef SQLULEN SQLROWSETSIZE;
typedef SQLULEN SQLTRANSID;
typedef SQLLEN SQLROWOFFSET;
#endif
					
SQLSETPOSIROW 的定義已經變更為 32 位元和 64 位元編譯:
#ifdef _WIN64
typedef UINT64 SQLSETPOSIROW;
#else
#define SQLSETPOSIROW SQLUSMALLINT
#endif
					
SQLLEN 和 SQLULEN 的定義已經變更為 64 位元編譯:
#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
					
較新的標頭中以不同的方式定義書籤型別:
typedef SQLULEN         BOOKMARK;
					

函式宣告的變更

下列函式簽章已變更為 64 位元程式設計以容納新的型別。以粗體文字項目是特定變更的參數。
  • SQLBindCol (SQLHSTMT StatementHandle SQLUSMALLINT ColumnNumber SQLSMALLINT TargetType SQLPOINTER TargetValue SQLLEN BufferLengthSQLLEN * StrLen_or_Ind) ;
  • SQLBindParam (SQLHSTMT StatementHandle SQLUSMALLINT ParameterNumber SQLSMALLINT 實質 SQLSMALLINT ParameterType SQLULEN LengthPrecision,SQLSMALLINT ParameterScale SQLPOINTER ParameterValue SQLLEN * StrLen_or_Ind) ;
  • SQLBindParameter (SQLHSTMT hstmt SQLUSMALLINT ipar SQLSMALLINT fParamType SQLSMALLINT fCType SQLSMALLINT fSqlType,SQLULEN cbColDef,SQLSMALLINT ibScale SQLPOINTER rgbValue,SQLLEN cbValueMaxSQLLEN * pcbValue) ;
  • SQLColAttribute (SQLHSTMT StatementHandle SQLUSMALLINT ColumnNumber SQLUSMALLINT FieldIdentifier SQLPOINTER CharacterAttribute SQLSMALLINT BufferLength,SQLSMALLINT * StringLength SQLLEN * NumericAttribute)
  • 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 * NameLength SQLSMALLINT * 資料類型,SQLULEN * ColumnSize,SQLSMALLINT * DecimalDigits SQLSMALLINT * 可為 Null) ;
  • SQLDescribeParam (SQLHSTMT hstmt SQLUSMALLINT ipar SQLSMALLINT * pfSqlType,SQLULEN * pcbParamDef,SQLSMALLINT * pibScale SQLSMALLINT * pfNullable) ;
  • SQLExtendedFetch(SQLHSTMT hstmt, SQLUSMALLINT fFetchType, SQLLEN irow, SQLULEN * pcrow, SQLUSMALLINT * rgfRowStatus)
  • SQLFetchScroll (SQLHSTMT StatementHandle SQLSMALLINT FetchOrientation SQLLEN FetchOffset) ;
  • SQLGetData (SQLHSTMT StatementHandle SQLUSMALLINT ColumnNumber SQLSMALLINT TargetType SQLPOINTER TargetValue SQLLEN BufferLengthSQLLEN * StrLen_or_Ind) ;
  • SQLGetDescRec (SQLHDESC DescriptorHandle SQLSMALLINT RecNumber SQLCHAR 形式 * 命名,SQLSMALLINT BufferLength SQLSMALLINT * StringLength SQLSMALLINT * 輸入 SQLSMALLINT * 子型別,SQLLEN * 長度,SQLSMALLINT * 整數位數、 SQLSMALLINT * 縮放比例、 SQLSMALLINT * Nullable) ;
  • SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN * pirow)
  • SQLPutData (SQLHSTMT StatementHandle,SQLPOINTER 資料 SQLLEN StrLen_or_Ind) ;
  • SQLRowCount SQLHSTMT StatementHandle (SQLLEN * 資料列計數) ;
  • SQLSetConnectOption (SQLHDBC ConnectHandle,SQLUSMALLINT 選項 SQLULEN 值) ;
  • SQLSetPos (SQLHSTMT hstmt,SQLSETPOSIROW irow,SQLUSMALLINT fOption,SQLUSMALLINT fLock) ;
  • SQLSetDescRec (SQLHDESC DescriptorHandle、 SQLSMALLINT RecNumber、 SQLSMALLINT 的輸入,SQLSMALLINT 子型別、 SQLLEN 長度、 SQLSMALLINT 整數位數、 SQLSMALLINT 縮放比例、 SQLPOINTER 資料 SQLLEN * StringLengthSQLLEN * 指標) ;
  • SQLSetParam (SQLHSTMT StatementHandle SQLUSMALLINT ParameterNumber SQLSMALLINT 實質 SQLSMALLINT ParameterType SQLULEN LengthPrecision,SQLSMALLINT ParameterScale SQLPOINTER ParameterValue,SQLLEN * StrLen_or_Ind) ;
  • SQLSetScrollOptions (SQLHSTMT hstmt SQLUSMALLINT fConcurrency,SQLLEN crowKeyset,SQLUSMALLINT crowRowset) ;
  • SQLSetStmtOption (SQLHSTMT StatementHandle,SQLUSMALLINT 選項 SQLULEN 值) ;

透過指標 ODBC API 呼叫所傳回的值

下列 ODBC 函數呼叫需要做為輸入參數的指標到從驅動程式會傳回資料的緩衝區。內容和傳回資料的意義是由其他輸入參數的函式來決定。在某些情況下這些方法可能會立即傳回 64 位元 (8 位元組整數) 值,而不是典型的 32 位元 (4 位元組) 整數值。這些情況下如下所示:

SQLColAttribute
FieldIdentifier 參數有下列值之一時中, 傳回 64 位元值 * NumericAttribute
SQL_DESC_DISPLAY_SIZE
SQL_DESC_LENGTH
SQL_DESC_OCTET_LENGTH
SQL_DESC_COUNT

SQLColAttributes
fDescType 參數有下列值之一時中, 傳回 64 位元值 * pfDesc
SQL_COLUMN_DISPLAY_SIZE
SQL_COLUMN_LENGTH
SQL_COLUMN_COUNT

SQLGetConnectAttr
屬性 參數有下列值之一時,在 [ 傳回 64 位元值:
SQL_ATTR_QUIET_MODE

SQLGetConnectOption
屬性 參數有下列值之一時,在 [ 傳回 64 位元值:
SQL_ATTR_QUIET_MODE

SQLGetDescField
FieldIdentifier 參數有下列值之一時中, 傳回 64 位元值 * ValuePtr
SQL_DESC_ARRAY_SIZE

SQLGetDiagField
DiagIdentifier 參數有下列值之一時中, 傳回 64 位元值 * DiagInfoPtr
SQL_DIAG_CURSOR_ROW_COUNT
SQL_DIAG_ROW_COUNT
SQL_DIAG_ROW_NUMBER

SQLGetInfo
資訊類型 參數有下列值之一時中, 傳回 64 位元值 * InfoValuePtr
SQL_DRIVER_HENV
SQL_DRIVER_HDBC
SQL_DRIVER_HLIB

資訊類型 具有下列 2 值之一 * InfoValuePtr 是 64 位元的輸入和輸出上:
SQL_DRIVER_HSTMT
SQL_DRIVER_HDESC

SQLGetStmtAttr
屬性 參數有下列值之一,64 位元值會傳回在 * ValuePtr
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_MAX_LENGTH
SQL_ATTR_MAX_ROWS
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_ARRAY_SIZE
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_NUMBER
SQL_ATTR_ROWS_FETCHED_PTR
SQL_ATTR_KEYSET_SIZE

SQLGetStmtOption
選項 參數有下列值之一,64 位元值會傳回在 * 值
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE
SQL_KEYSET_SIZE

SQLSetConnectAttr
屬性 參數有下列值之一時,64 位元值會傳遞 中:
SQL_ATTR_QUIET_MODE

SQLSetConnectOption
屬性 參數有下列值之一時,64 位元值會傳遞 中:
SQL_ATTR_QUIET_MODE

SQLSetDescField
FieldIdentifier 參數有下列值之一時,64 位元值傳入的 * ValuePtr
SQL_DESC_ARRAY_SIZE

SQLSetStmtAttr
屬性 參數有下列值之一時,64 位元值傳入的 * ValuePtr
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_MAX_LENGTH
SQL_ATTR_MAX_ROWS
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_ARRAY_SIZE
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_NUMBER
SQL_ATTR_ROWS_FETCHED_PTR
SQL_ATTR_KEYSET_SIZE

SQLSetConnectAttr
選項 參數有下列值之一時,64 位元值傳入的 * 值
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE
SQL_KEYSET_SIZE

?考

您可以取得 MDAC 2.7 程式庫和支援可以從下列 Microsoft 網站安裝 Microsoft 平台 SDK 從 64 位元編譯所需的標頭檔:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm (http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm)
ODBC 應用程式將需要使用下列檔案:

標頭檔:
  • Sqltypes.h
  • Sqlext.h
程式庫:
  • Odbc32.lib

這篇文章中的資訊適用於:
  • Microsoft Open Database Connectivity 3.7
關鍵字:?
kbmt kbinfo KB298678 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:298678? (http://support.microsoft.com/kb/298678/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
Retired KB Article依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。