擷取一列資料
若要擷取資料列,應用程式會呼叫 SQLFetch。 您可以使用任何類型的資料指標呼叫 SQLFetch,但只會以順向方向移動資料列集資料指標。 SQLFetch 會將資料指標推進到下一個資料列,並傳回任何與 SQLBindCol 呼叫繫結的資料行資料。 資料指標到達結果集的結尾時,SQLFetch 會傳回 SQL_NO_DATA。 如需呼叫 SQLFetch 的範例,請參閱使用 SQLBindCol。
確切來說,實作 SQLFetch 的方式是驅動程式專屬的方式,但一般模式是讓驅動程式從資料來源擷取任何繫結資料行的資料、根據繫結變數的類型轉換,並將轉換的資料放在這些變數中。 如果驅動程式無法轉換任何資料,SQLFetch 會傳回錯誤。 應用程式可以繼續擷取資料列,但目前資料列的資料會遺失。 未繫結資料行的資料會發生什麼情況,依驅動程式而定,但大部分驅動程式都會擷取和捨棄這些資料,或完全不擷取。
驅動程式也會設定任何已繫結之長度/指標緩衝區的值。 如果資料行的資料值為 Null,驅動程式會將對應的長度/指標緩衝區設定為 SQL_Null_DATA。 如果資料值不是 Null,驅動程式會在轉換之後,將長度/指標緩衝區設定為資料的位元組長度。 如果無法判斷此長度,因為有時會發生多個函式呼叫擷取的長資料情況,驅動程式會將長度/指標緩衝區設定為 SQL_NO_TOTAL。 對於固定長度資料類型,例如整數和日期結構,位元組長度為資料類型的大小。
對於可變長度的資料,例如字元和二進位資料,驅動程式會根據繫結至資料行之緩衝區的位元組長度,檢查已轉換資料的位元組長度。緩衝區的長度是在 SQLBindCol 的 BufferLength 引數中指定。 如果轉換資料的位元組長度大於緩衝區的位元組長度,驅動程式會截斷要放入緩衝區中的資料、傳回長度/指標緩衝區中的未截斷長度、傳回 SQL_SUCCESS_WITH_INFO,並將 SQLSTATE 01004 (已截斷資料) 放置在診斷中。 唯一的例外狀況是 SQLFetch 傳回時,可變長度書籤遭截斷,則此時會傳回 SQLSTATE 22001 (字串資料,右邊被截斷)。
固定長度的資料永遠不會被截斷,因為驅動程式會假設繫結緩衝區的大小等於資料類型的大小。 資料截斷很少見,因為應用程式通常會繫結足以保存整個資料值的緩衝區,並且會從中繼資料判斷必要的大小。 不過,應用程式可能會明確地繫結已知太小的緩衝區。 例如,應用程式可能會擷取並顯示部分描述的前 20 個字元,或長文字資料行的前 100 個字元。
即使已截斷字元資料,驅動程式也必須以 Null 終止,才能傳回應用程式。 Null 終止字元不包含在傳回的位元組長度中,但需要繫結緩衝區中的空格。 例如,假設應用程式使用由 ASCII 字元集中的字元資料組成的字串,驅動程式有 50 個字元的資料要傳回,而應用程式的緩衝區長度為 25 個位元組。 此時,在應用程式的緩衝區中,驅動程式會傳回前 24 個字元,後面接著 Null 終止字元。 在長度/指標緩衝區中,則會傳回長度為 50 的位元組長度。
應用程式可以在執行建立結果集的陳述式之前,先設定 SQL_ATTR_MAX_ROWS 陳述式屬性,來限制結果集中的資料列數目。 例如,在用來將報告格式化之應用程式中,預覽模式只需要足夠的資料就能顯示報告第一頁。 由於限制了結果集的大小,因此這類功能的執行速度會更快。 此陳述式屬性旨在減少流量,而且並非所有驅動程式都支援。