共用方式為


擷取結果數據

ODBC 應用程式有三個選項可用來擷取結果數據。

第一個選項是以 SQLBindCol 為基礎。 擷取結果集之前,應用程式會使用 SQLBindCol 將結果集中的每個數據行系結至程式變數。 系結數據行之後,驅動程式會在每次應用程式呼叫 SQLFetchSQLFetchScroll 時,將目前數據列的數據傳送至系結至結果集數據行的變數。 如果結果集數據行和程式變數具有不同的數據類型,驅動程式會處理數據轉換。 如果應用程式已設定大於 1 SQL_ATTR_ROW_ARRAY_SIZE,它可以將結果數據行系結至變數陣列,這些變數會在每次呼叫 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 資料類型。 如果為 ntextncharnvarchar 資料行指定SQL_C_DEFAULT,則會將 Unicode 數據傳回給應用程式。 如果應用程式尚未編碼來處理 Unicode 數據,這可能會導致各種問題。 uniqueidentifier (SQL_GUID) 數據類型可能發生相同的問題類型。

textntextimage 數據通常太大而無法放入單一程式變數中,而且通常會使用 SQLGetData 處理,而不是 SQLBindCol。 使用伺服器數據指標時,SQL Server Native Client ODBC 驅動程式會優化,以在擷取數據列時,不會傳輸未系結文字、ntextimage 數據行的數據。 除非應用程式發出數據行的 SQLGetData否則不會實際從伺服器擷取 text、ntextimage 數據。

此優化可以套用至應用程式,讓使用者在向上和向下捲動游標時,不會顯示 任何文字ntext影像 數據。 用戶選取數據列之後,應用程式可以呼叫 SQLGetData 來擷取 textntextimage 數據。 這樣會儲存使用者未選取的任何數據列的 文字ntext影像 數據,並儲存非常大量數據的傳輸。

另請參閱

處理結果 (ODBC)