將資料從 SQL 轉換成 C 資料類型

當應用程式呼叫 SQLFetchSQLFetchScrollSQLGetData 時,驅動程式會從數據源擷取數據。 如有必要,它會從驅動程式擷取數據的數據型別轉換成 SQLBindCol 或 SQLGetData 中 TargetType 自變數所指定的數據類型。最後,它會將數據儲存在 SQLBindColSQLGetData 中 TargetValuePtr 自變數所指向的位置(以及 ARD 的SQL_DESC_DATA_PTR字段)。

下表顯示從 ODBC SQL 資料類型轉換成 ODBC C 資料類型的支持轉換。 填滿的圓形表示 SQL 資料類型的預設轉換(當 TargetType 的值SQL_C_DEFAULT時,數據將轉換成的 C 數據類型)。 空心圓表示支持的轉換。

對於使用 ODBC 2.x 驅動程式的 ODBC 3.x 應用程式,可能不支援從驅動程式特定資料類型轉換。

已轉換數據的格式不會受到 Windows 國家/地區設定的影響。

下列各節中的數據表說明驅動程式或數據源如何轉換從數據源擷取的數據;驅動程式必須支援從其支援的 ODBC SQL 資料類型轉換成所有 ODBC C 資料類型。 針對指定的 ODBC SQL 資料類型,數據表的第一個數據行會列出 SQLBindCol 和 SQLGetDataTargetType 自變數的法律輸入值。 第二個數據行會列出測試結果,通常是使用 SQLBindColSQLGetData 中指定的 BufferLength 自變數,驅動程式會執行此自變數來判斷它是否可以轉換數據。 針對每個結果,第三個和第四個數據行會列出 TargetValuePtr指定緩衝區中的值,並在驅動程式嘗試轉換數據之後,StrLen_or_IndPtr SQLBindColSQLGetData 中指定的自變數。 (The StrLen_or_IndPtr自變數對應至ARD的SQL_DESC_OCTET_LENGTH_PTR欄位。最後一個數據行會列出 SQLFetchSQLFetchScrollSQLGetData 針對每個結果傳回的 SQLSTATE。

如果 SQLBindColSQLGetData 中的 TargetType 自變數包含指定 ODBC SQL 數據類型、SQLFetch、SQLFetchScrollSQLGetData 傳回 SQLSTATE 07006 (限制數據類型屬性違規)數據表中未顯示的 ODBC C 數據類型識別符。 如果 TargetType 自變數包含標識符,指定從驅動程式特定 SQL 數據類型轉換成 ODBC C 數據類型的識別碼,驅動程式、SQLFetch、SQLFetchScrollSQLGetData 會傳回 SQLSTATE HYC00 (未實作的選擇性功能) 不支援此轉換。

雖然數據表中未顯示,但是當 SQL 資料值為 NULL 時,驅動程式會在StrLen_or_IndPtr自變數所 指定的緩衝區中傳回SQL_NULL_DATA 。 如需在進行多個呼叫以擷取數據時使用StrLen_or_IndPtr的說明,請參閱 SQLGetData 函式描述。 當 SQL 資料轉換成字元 C 數據時,*StrLen_or_IndPtr 中傳回的字元計數不包含 null 終止位元組。 如果 TargetValuePtr 是 Null 指標,SQLGetData 會傳回 SQLSTATE HY009 (Null 指標的無效使用):在 SQLBindCol,這會解除數據行的系結。

資料表中會使用下列詞彙和慣例:

  • 位元組長度的數據 是可在 *TargetValuePtr 中傳回的 C 數據位元組數,無論數據在傳回至應用程式之前,是否會被截斷。 對於字串數據,這不包含 null 終止字元的空間。

  • 位元位元組長度 是以字元格式顯示數據所需的位元組總數。 這是針對 [顯示大小] 區段中的每個 C 數據類型所定義,不同之處在於,當顯示大小為字元時,字元位元組長度是以位元組為單位。

  • 斜體中的單字代表 SQL 文法的函式自變數或元素。 如需文法元素的語法,請參閱 附錄 C:SQL 文法

此章節包含下列主題。