資料長度、緩衝區長度和截斷
資料長度是指資料的位元組長度,因為它會儲存在應用程式的資料緩衝區中,而不是儲存在資料來源中。 這項區別很重要,因為資料儲存在資料緩衝區中的類型,通常與儲存在資料來源中的類型不同。 因此,對於傳送至資料來源的資料,這是指轉換成資料來源類型之前的資料位元組長度。 對於擷取自資料來源的資料,這是指轉換成資料緩衝區類型之後,且在完成任何截斷之前,資料的位元組長度。
對於固定長度的資料,例如整數或日期結構,資料的位元組長度一律是資料類型的大小。 一般而言,應用程式會配置與資料類型相同大小的資料緩衝區。 如果應用程式配置較小的緩衝區,則結果為未定義,因為驅動程式會假設資料緩衝區的大小與資料類型相同,且不會截斷資料以符合較小的緩衝區。 如果應用程式配置較大的緩衝區,額外空間將永遠用不到。
對於可變長度的資料,例如字元或二進位資料,請務必瞭解資料的位元組長度與緩衝區的位元組長度互相分開,且兩者通常不同。 這兩個長度之間的關聯會在緩衝區一節中描述。 如果資料的位元組長度大於緩衝區的位元組長度,驅動程式會將擷取的資料截斷為緩衝區的位元組長度,並傳回含 SQLSTATE 01004 的 SQL_SUCCESS_WITH_INFO (已截斷的資料)。 不過,傳回的位元組長度是未截斷資料的長度。
例如,假設應用程式為二進位資料緩衝區配置 50 個位元組。 如果驅動程式須傳回 10 個位元組的二進位資料,它會在緩衝區中傳回這 10 個位元組。 資料的位元組長度為 10,而緩衝區的位元組長度為 50。 如果驅動程式須傳回 60 個位元組的二進位資料,它會將資料截斷為 50 個位元組、在緩衝區中傳回這些位元組,並傳回 SQL_SUCCESS_WITH_INFO。 資料的位元組長度為 60 (截斷前的長度),而緩衝區的位元組長度仍為 50。
系統會針對截斷的每個資料行建立診斷記錄。 驅動程式建立這些記錄,以及應用程式加以處理都需要時間,因此截斷可能會降低效能。 通常,應用程式可以透過配置夠大的緩衝區來避免這個問題,不過處理長資料時可能無法這樣做。 發生資料截斷時,應用程式有時可以配置較大的緩衝區並重新擷取資料;但並非所有案例皆是如此。 如果在取得呼叫 SQLGetData 的資料時發生截斷,應用程式無須針對已傳回的資料呼叫 SQLGetData;如需詳細資訊,請參閱取得長資料。