文章編號: 294169 - 上次校閱: 2003年5月12日 - 版次: 2.1

長度的 Unicode ODBC 函式的引數的 DOC: 說明

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

結論

ODBC 驅動程式管理員 3.5 或更新版本支援接受字元字串或 SQLPOINTER 指標在其引數中的所有函數 ANSI 和 Unicode 的版本。Unicode 函式會實作成的"W",例如 SQLExecDirectWSQLGetInfoW 尾碼的函式。

對於有許多這些 Unicode 函式 ODBC 程式設計人員參考手冊 》 提供某些函式引數不正確或模稜兩可描述。特別,用來指定的字元長度的字串輸入和輸出值的引數和有關這個問題。

其他相關資訊

ODBC 文件中的問題牽涉到是否長度引數應該在輸入或輸出字串中指定的字元數或位元組的數目。這些函式的 ANSI 版本的字串中的位元組計數等於的字元計數 (因為 ANSI 字元所佔據只是一個位元組各),所以條款個位元組 」 和 「 字元 」 可以有效地交換使用。不過,Unicode 字串與每個字元會佔用兩個位元組。因此,務必來分辨是否長度的輸入給 Unicode 函式必須指定的位元組或字元。

在某些情況下文件文字位元組 」 時使用字元"這個字應該使用來代替。在其他情況下文件並不一定是不正確,但指定字串的"長度 」 需要的沒有明確地記載是否這個值應該的位元組計數或的字元計數。

無論什麼說明文件指出每個 ODBC 函式,下列段落從 < 第 17:: 程式設計考量 > ODBC 程式設計人員參考手冊 》 中的 [Unicode] 區段會是最終規則用於 Unicode 函式中的長度引數:
"永遠傳回,或接受字串或引數長度的 Unicode 函式會傳遞為字元計數。傳回伺服器資料的長度資訊的函式的顯示大小和精確度將會說明的字元數。當字串或非字串資料能參照長度 (資料傳輸大小) 時,長度述八位元長度決定。例如 SQLGetInfoW 仍會與計數-的-位元組,長度但 SQLExecDirectW 將會使用字元計數 」。
這表示如果有問題的引數說明永遠是 (通常以表示一個 SQLCHAR 形式),字串的另一個引數的長度,然後長度會反映在字串中的字元數目。如果長度引數描述了另一個可能是字串或 (通常表示為一個 SQLPOINTER) 其他資料類型的引數長度,是以位元組為單位)。

下列表格列出所有有 Unicode 版本的 ODBC API 函式。列出每個函式的資料表會反白顯示 [ODBC] 文件中已知的問題,並提供更完整長度引數有問題的描述。

摺疊此表格展開此表格
函式引數名稱目前的描述更正過的描述
SQLBrowseConnectStringLength1長度 * InConnectionString。長度 * 以字元為單位的 InConnectionString。
BufferLength長度為 * OutConnectionString 緩衝區。長度為 * 中字元的 OutConnectionString 緩衝區。
StringLength2Ptr(不含 Null 終止位元組) 的位元組總數中傳回可使用 * OutConnectionString。(不含 Null 終端字元) 的字元總數中傳回可使用 * OutConnectionString。
SQLColAttributeBufferLength此引數如果 FieldIdentifier 是 ODBC 定義的欄位,且 CharacterAttributePtr 指向字元字串或二進位的緩衝區必須的長度 * CharacterAttributePtr。如果 FieldIdentifier 是 ODBC 定義的欄位和 * CharacterAttributePtr 是一個整數,這個欄位會被忽略。如果 * CharacterAttributePtr 是 Unicode 字串,呼叫 SQLColAttributeW) 時,BufferLength 引數必須是偶數這是正確的。BufferLength 是指可供 CharacterAttributePtr 中值的位元組數目。
StringLengthPtr要傳回其 (不含 Null 終止位元組字元資料) 的位元組總數中的緩衝區的指標傳回中可使用 * CharacterAttributePtr。這是正確的。
SQLColAttributes如被取代 SQLColAttribute (請參閱上述) 這個函式。
SQLColumnPrivilegesNameLength1 4長度 * CatalogName。(注意這裡有四個不同的引數的長度值。每一個是指不同的輸入或 CatalogName]、 [SchemaName]、 [表格名稱,] 和 [ColumnName 等的輸出緩衝區。為了簡單起見,具有類似的輸入值的任何函式的這個資料表結合了這類的 NameLength 引數,而不分別列出每一個)長度 * 以字元為單位的 CatalogName。
SQLColumnsNameLength1 4長度 * CatalogName。長度 * 以字元為單位的 CatalogName。
SQLConnectNameLength1 3長度 * 伺服器名稱。長度 * 以字元為單位的 ServerName。
SQLDataSourcesBufferLength1長度為 * (以位元組為單位) 的伺服器名稱緩衝區。長度為 * 中字元的伺服器名稱緩衝區。
NameLength1Ptr要傳回其 (不含 Null 終止位元組) 的位元組總數中的緩衝區指標。要傳回其字元 (不含 Null 終端字元) 的總數中的緩衝區指標。
BufferLength2長度為 * 描述緩衝區。長度為 * 中字元的描述緩衝區。
NameLength2Ptr要傳回其 (不含 Null 終止位元組) 的位元組總數中的緩衝區的指標傳回中可使用 * 描述。要傳回總數 (不含 Null 終端字元) 的字元緩衝區的指標傳回中可使用 * 描述。
SQLDescribeColBufferLength長度為 * 字元中的 ColumnName 緩衝區。這是正確的。
NameLengthPtr要傳回其 (不含 Null 終止位元組) 的位元組總數中的緩衝區的指標傳回中可使用 * ColumnName。要傳回總數 (不含 Null 終端字元) 的字元緩衝區的指標傳回中可使用 * ColumnName。
SQLDriverConnectStringLength1長度為 * (以位元組為單位) 的 InConnectionString。長度 * 以字元為單位的 InConnectionString。
BufferLength長度為 * OutConnectionString 緩衝區。如果 * OutConnectionString 值是 Unicode 字串,呼叫 SQLDriverConnectW) 時,BufferLength 引數必須是偶數。長度為 * 中字元的 OutConnectionString 緩衝區。(請注意這表示此引數並不一定要偶數)。
StringLength2Ptr要傳回總數 (不含 Null 終端字元) 的字元緩衝區的指標傳回中可使用 * OutConnectionString。這是正確的。
SQLDriversBufferLength1長度為 * (以位元組為單位) 的 DriverDescription 緩衝區。長度為 * 中字元的 DriverDescription 緩衝區。
DescriptionLengthPtr要傳回其 (不含 Null 終止位元組) 的位元組總數中的緩衝區的指標傳回中可使用 * DriverDescription。要傳回總數 (不含 Null 終端字元) 的字元緩衝區的指標傳回中可使用 * DriverDescription。
BufferLength2長度為 * (以位元組為單位) 的 DriverAttributes 緩衝區。如果 * DriverDescription 值是 Unicode 字串,呼叫 SQLDriversW) 時,BufferLength 引數必須是偶數。長度為 * 中字元的 DriverAttributes 緩衝區。(請注意這表示此引數並不一定要偶數)。
AttributesLengthPtr要傳回其 (不含 Null 終止位元組) 的位元組總數中的緩衝區的指標傳回中可使用 * DriverAttributes。要傳回總數 (不含 Null 終端字元) 的字元緩衝區的指標傳回中可使用 * DriverAttributes。
SQLError這個函式已被取代來 SQLGetDiagRec。
SQLExecDirectTextLength長度 * StatementText。長度 * 以字元為單位的 StatementText。
SQLForeignKeysNameLength1 2長度為 * (以位元組為單位) 的 PKCatalogName。長度 * 以字元為單位的 PKCatalogName。
NameLength3 6長度 * PKTableName。長度 * 以字元為單位的 PKTableName。
SQLGetConnectAttrBufferLength如果在值 * ValuePtr 是 Unicode 字串,呼叫 SQLGetConnectAttrW) 時,BufferLength 引數必須是偶數。這是正確的。BufferLength 應該包含位元組的計數。
StringLengthPtr要傳回其 (不含 Null 終端字元) 的位元組總數中的緩衝區的指標傳回中可使用 * ValuePtr。這是正確的。
SQLGetConnectOption這個函式已被取代來 SQLGetConnectAttr。
SQLGetCursorNameBufferLength長度為 * (以位元組為單位) 的 CursorName。如果在值 * CursorName 是 Unicode 字串,呼叫 SQLGetCursorNameW) 時,BufferLength 引數必須是偶數。長度 * 以字元為單位的 CursorName。(請注意這表示此引數並不一定要偶數)。
NameLengthPtr要傳回其 (不含 Null 終端字元) 的位元組總數的記憶體的指標傳回中可使用 * CursorName。指標,以傳回 (不含 Null 終端字元) 的字元總數的記憶體可用以傳回 * CursorName。
SQLGetDescFieldBufferLength如果在值 * ValuePtr 是 Unicode 資料型別呼叫 SQLGetDescFieldW) 時,BufferLength 引數必須是偶數。這是正確的。BufferLength 應該包含位元組的計數。
StringLengthPtr要傳回 (不包括所需的 Null 終端字元的位元組數) 的位元組總數緩衝區的指標傳回中可使用 * ValuePtr。這是正確的。
SQLGetDescRecBufferLength長度為 * (以位元組為單位) 的名稱緩衝區。長度為 * 中字元的名稱緩衝區。
StringLengthPtr要傳回其可用以傳回資料的位元組數中的緩衝區的指標 * 名稱緩衝區不包括 Null 終端字元。緩衝區,傳回可用來傳回中字元數的指標 * 名稱緩衝區不包括 Null 終端字元。
SQLGetDiagFieldBufferLength如果在值 * DiagInfoPtr 是 Unicode 字串,呼叫 SQLGetDiagFieldW) 時,BufferLength 引數必須是偶數。這是正確的。BufferLength 應該包含位元組的計數。
StringLengthPtr要傳回其 (不包括所需的 Null 終端字元的位元組數) 的位元組總數中的緩衝區的指標傳回中可使用 * DiagInfoPtr,對字元資料。這是正確的。
SQLGetDiagRecBufferLength長度為 * MessageText 緩衝區,以字元為單位。這是正確的
TextLengthPtr要傳回其 (不包括所需的 Null 終端字元的位元組數) 的位元組總數中的緩衝區的指標傳回中可使用 * MessageText。要傳回總數 (不含 Null 終端字元) 的字元緩衝區的指標傳回中可使用 * MessageText。
SQLGetInfoBufferLength長度為 * InfoValuePtr 緩衝區。如果 * InfoValuePtr 是 Unicode 字串,呼叫 SQLGetInfoW) 時,BufferLength 引數必須是偶數。這是正確的。BufferLength 應該包含位元組的計數。
StringLengthPtr要傳回其 (不含 Null 終端字元的字元資料) 的位元組總數中的緩衝區的指標傳回中可使用 * InfoValuePtr。這是正確的。
SQLGetStmtAttrBufferLength如果屬性是一個 ODBC 定義的屬性,且 ValuePtr 指向字元字串或二進位緩衝區此引數必須的長度 * ValuePtr。如果在傳回值 * ValuePtr 是 Unicode 字串,呼叫 SQLGetStmtAttrW) 時,BufferLength 引數必須是偶數這是正確的。BufferLength 應該包含位元組的計數。
StringLengthPtr要傳回其 (不含 Null 終端字元) 的位元組總數中的緩衝區的指標傳回中可使用 * ValuePtr。這是正確的。
SQLNativeSQLTextLength1長度 * InStatementText 文字字串。長度 * InStatementText 文字字串以字元為單位。
BufferLength長度為 * OutStatementText 緩衝區。如果在傳回值 * InStatementText 是 Unicode 字串,呼叫 SQLNativeSqlW) 時,BufferLength 引數必須是偶數。長度為 * 中字元的 OutStatementText 緩衝區。(請注意這表示此引數並不一定要偶數)。
TextLength2Ptr要傳回其 (不含 Null 終止位元組) 的位元組總數中的緩衝區的指標傳回中可使用 * OutStatementText。要傳回總數 (不含 Null 終端字元) 的字元緩衝區的指標傳回中可使用 * OutStatementText。
SQLPrepareTextLength長度 * StatementText。長度 * 以字元為單位的 StatementText。
SQLPrimaryKeysNameLength1 3長度以位元組為單位的 * CatalogName。長度 * 以字元為單位的 CatalogName。
SQLProcedureColumnsNameLength1 4長度 * CatalogName。長度 * 以字元為單位的 CatalogName。
SQLProceduresNameLength1 3長度以位元組為單位的 * CatalogName。長度 * 以字元為單位的 CatalogName。
SQLSetConnectAttrStringLength如果屬性是一個 ODBC 定義的屬性,且 ValuePtr 指向字元字串或二進位緩衝區此引數必須的長度 * ValuePtr。如果屬性是一個 ODBC 定義的屬性,且 ValuePtr 指向字元字串或二進位緩衝區此引數必須的長度 * ValuePtr。字元字串資料此引數應該包含在字串中的位元組數目。
SQLSetConnectOption這個函式已被取代來 SQLSetConnectAttr。
SQLSetCursorNameNameLength長度 * CursorName。長度 * 以字元為單位的 CursorName。
SQLSetDescFieldBufferLength此引數如果 FieldIdentifier 是 ODBC 定義的欄位,且 ValuePtr 指向字元字串或二進位的緩衝區必須的長度 * ValuePtr。此引數如果 FieldIdentifier 是 ODBC 定義的欄位,且 ValuePtr 指向字元字串或二進位的緩衝區必須的長度 * ValuePtr。字元字串資料此引數應該包含在字串中的位元組數目。
SQLSetStmtAttrStringLength如果屬性是一個 ODBC 定義的屬性,且 ValuePtr 指向字元字串或二進位緩衝區此引數必須的長度 * ValuePtr。如果屬性是一個 ODBC 定義的屬性,且 ValuePtr 指向字元字串或二進位緩衝區此引數必須的長度 * ValuePtr。字元字串資料此引數應該包含在字串中的位元組數目。
SQLSpecialColumnsNameLength1 3長度 * 的表格名稱。長度 * 以字元為單位的 TableName。
SQLStatisticsNameLength1 3長度 * CatalogName。長度 * 以字元為單位的 CatalogName。
SQLTablePrivilegesNameLength1 3長度 * CatalogName。長度 * 以字元為單位的 CatalogName。
SQLTablesNameLength1 4長度 * CatalogName。長度 * 以字元為單位的 CatalogName。

使用 SQLDriverConnect 範例,從 [InConnectionString] 和 [OutConnectionString 引數上面表格兩者都定義為 SQLCHAR 形式 * 因此 StringLength1BufferLength 應該表示字串中的字元數目。相較之下,考慮 SQLGetInfo 函式。這個函式的輸入 InfoValuePtr,和這個輸入長度傳遞 BufferLength 中。因為 InfoValuePtr 可以包含字串和其他類型的資料,它會是一個 SQLPOINTER。因此,將上面所述規則的套用,BufferLength 將會位元組,而不是字元的計數。

?考

下列 「 Microsoft 知識庫 」 文件包含已經已經更正了 SQLGetDiagRecW 文件的上述問題的資訊:
243526? (http://support.microsoft.com/kb/243526/EN-US/ ) DOC: ODBC 規格不正確地指出 SQLGetDiagRecW bufferlength 中會發生成位元組數

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