提取結果資料

ODBC 應用程式具備三個提取結果資料的選項。

第一個選項是以 SQLBindCol為基礎。 在擷取結果集之前,應用程式會使用 SQLBindCol 將結果集中的每個資料行系結至程式變數。 系結資料行之後,驅動程式會在每次應用程式呼叫SQLFetch 或 SQLFetchScroll時,將目前資料列的資料傳送至系結至結果集資料行的變數。 如果結果集資料行和程式變數的資料類型不同,驅動程式會處理資料轉換。 如果應用程式SQL_ATTR_ROW_ARRAY_SIZE設定大於 1,它可以將結果資料行系結至變數陣列,這些變數會在每次呼叫 SQLFetchScroll時填滿。

第二個選項是以 SQLGetData為基礎。 應用程式不會使用 SQLBindCol 將結果集資料行系結至程式變數。 每次呼叫 SQLFetch之後,應用程式會針對結果集中的每個資料行呼叫 SQLGetData 一次。 SQLGetData 會指示驅動程式將資料從特定結果集資料行傳輸到特定程式變數,並指定資料行和變數的資料類型。 如果結果資料行和程式變數的資料類型不同,這會讓驅動程式轉換資料。 TextNtextimage 資料行通常太大而無法放入程式變數中,但仍可使用 SQLGetData來擷取。 如果結果資料行中的 textNtextimage 資料大於程式變數, SQLGetData 會傳回 SQL_SUCCESS_WITH_INFO 和 SQLSTATE 01004 (字串資料,以右截斷) 。 對 SQLGetData的後續呼叫會傳回連續的文字影像資料區塊。 達到資料結尾時, SQLGetData 會傳回SQL_SUCCESS。 如果 SQL_ATTR_ROW_ARRAY_SIZE 大於 1,每次提取都會傳回一組資料列或資料列集。 使用 SQLGetData之前,您必須先使用 SQLSetPos 將資料列集中的特定資料列指定為目前的資料列。

第三個選項是混合使用 SQLBindColSQLGetData。 例如,應用程式可以系結結果集的前十個數據行,然後在每個擷取時呼叫 SQLGetData 三次,以從三個未系結的資料行擷取資料。 當結果集包含一或多個 文字影像 資料行時,通常會使用這個方法。

根據結果集的資料指標選項組,應用程式也可以使用 SQLFetchScroll 的捲動選項來捲動結果集。

過度使用 SQLBindCol 將結果集資料行系結至程式變數的成本很高,因為 SQLBindCol 會導致 ODBC 驅動程式配置記憶體。 當您將結果資料行系結至變數時,該系結會維持有效狀態,直到您呼叫SQLFreeHandle以釋放語句控制碼,或呼叫將 fOption設定為 SQL_UNBIND的SQLFreeStmt為止。 當陳述式完成時,不會自動復原繫結。

此邏輯可讓您利用不同的參數,有效地處理執行相同的 SELECT 陳述式數次。 因為結果集會保留相同的結構,所以您可以系結結果集一次,處理所有 SELECT 語句,然後呼叫 SQLFreeStmt ,並將 fOption 設為最後一次執行之後SQL_UNBIND。 您不應該呼叫 SQLBindCol 來系結結果集中的資料行,而不需要先呼叫 SQLFreeStmt並將 fOption 設定為 SQL_UNBIND 釋放任何先前的系結。

使用 SQLBindCol時,您可以執行資料列或資料行系結。 資料列取向的繫結比資料行取向的繫結稍快。

您可以使用 SQLGetData 逐欄擷取資料,而不是使用 SQLBindCol系結結果集資料行。 如果結果集只包含幾個資料列,則使用 SQLGetData 而非 SQLBindCol 的速度較快;否則, SQLBindCol 可提供最佳效能。 如果您不一定會將資料放在同一組變數中,您應該使用 SQLGetData 而不是持續重新系結。 只有在所有資料行都與SQLBindCol系結之後,才能在選取清單中的資料行上使用SQLGetData。 資料行也必須出現在您已使用 SQLGetData的任何資料行之後。

處理將資料移入或移出程式變數的 ODBC 函式,例如SQLGetDataSQLBindCol 和 SQLBindParameter,都支援隱含資料類型轉換。 例如,如果應用程式將整數資料行繫結至字元字串程式變數,驅動程式會先自動將資料從整數轉換為字元,然後再將其放入程式變數中。

在應用程式中進行的資料轉換應該降至最低。 出非需要進行資料轉換才能讓應用程式完成處理,否則,應用程式應該將資料行和參數繫結至相同資料類型的程式變數。 不過,如果資料必須從一種類型轉換為另一種類型,讓驅動程式執行轉換比在應用程式中進行轉換還要有效率。 SQL Server Native Client ODBC 驅動程式通常會直接將資料從網路緩衝區傳輸到應用程式的變數。 要求驅動程式執行資料轉換會強制驅動程式緩衝處理資料,並使用 CPU 循環轉換資料。

程式變數應該夠大,足以保存從資料行傳輸的資料,但 textNtextimage 資料除外。 如果應用程式嘗試擷取結果集資料,並將其放入太小而無法容納它的變數中,驅動程式會產生警告。 這會強迫驅動程式為訊息配置記憶體,而且驅動程式和應用程式都必須花費 CPU 循環來處理訊息並進行錯誤處理。 應用程式應該配置夠大的變數來容納要擷取的資料,或使用選取清單中的 SUBSTRING 函數來縮減資料行在結果集中的大小。

使用 SQL_C_DEFAULT 來指定 C 變數的類型時請務必小心。 SQL_C_DEFAULT 指定 C 變數的類型必須符合資料行或參數的 SQL 資料類型。 如果為NtextNchar 或 Nvarchar資料行指定了SQL_C_DEFAULT,則會將 Unicode 資料傳回至應用程式。 如果尚未撰寫應用程式的程式碼來處理 Unicode 資料,這可能會導致各種問題。 uniqueidentifier (SQL_GUID) 資料類型可能會發生相同的問題類型。

textNtextimage 資料通常太大而無法放入單一程式變數中,而且通常會使用 SQLGetData 來處理,而不是 SQLBindCol。 使用伺服器資料指標時,SQL Server Native Client ODBC 驅動程式已優化,不會在擷取資料列時傳輸未系結textNtextimage資料行的資料。 在應用程式發出資料行的SQLGetData之前,不會實際從伺服器擷取textNtextimage資料。

此優化可以套用至應用程式,讓使用者在向上和向下捲動資料指標時,不會顯示 任何 textNtextimage 資料。 使用者選取資料列之後,應用程式可以呼叫 SQLGetData 來擷取 textNtextimage 資料。 這樣會儲存使用者未選取的任何資料列的 textNtextimage 資料傳輸,而且可以儲存非常大量資料的傳輸。

另請參閱

處理結果 (ODBC)