Поделиться через


Длина данных, длина буфера и усечение

Длина данных — это длина байтов данных, так как она будет храниться в буфере данных приложения, а не так, как она хранится в источнике данных. Это различие важно, так как данные часто хранятся в разных типах в буфере данных, чем в источнике данных. Поэтому для отправки данных в источник данных это байтовая длина данных перед преобразованием в тип источника данных. Для получения данных из источника данных это байтовая длина данных после преобразования в тип буфера данных и до завершения усечения.

Для данных фиксированной длины, таких как целое число или структура дат, длина байтов данных всегда является размером типа данных. Как правило, приложения выделяют буфер данных, который является размером типа данных. Если приложение выделяет меньший буфер, последствия не определены, так как драйвер предполагает, что буфер данных — это размер типа данных и не усечение данных для размещения в меньшем буфере. Если приложение выделяет больший буфер, то дополнительное пространство никогда не используется.

Для данных переменной длины, таких как символьные или двоичные данные, важно признать, что длина байтов данных отличается от длины байтов буфера. Отношение этих двух длин описывается в разделе "Буферы ". Если длина байтов данных превышает длину байтов буфера, драйвер усекает данные в байтовую длину буфера и возвращает SQL_SUCCESS_WITH_INFO с SQLSTATE 01004 (усеченные данные). Однако возвращаемая длина байтов — это длина ненадежных данных.

Например, предположим, что приложение выделяет 50 байт для двоичного буфера данных. Если драйвер имеет 10 байт двоичных данных для возврата, он возвращает эти 10 байт в буфере. Длина байтов данных составляет 10, а длина байта буфера равна 50. Если драйвер имеет 60 байт двоичных данных для возврата, он усечение данных до 50 байт, возвращает эти байты в буфере и возвращает SQL_SUCCESS_WITH_INFO. Длина байтов данных составляет 60 (длина перед усечением), а длина байта буфера по-прежнему равна 50.

Для каждого столбца, усеченного, создается диагностическая запись. Так как драйверу потребуется время для создания этих записей и обработки приложений, усечение может снизить производительность. Как правило, приложение может избежать этой проблемы путем выделения достаточно больших буферов, хотя это может быть невозможно при работе с длинными данными. При усечении данных приложение иногда может выделить больший буфер и получить ссылку на данные; Это не верно во всех случаях. Если усечение происходит при получении данных с вызовами SQLGetData, приложению не нужно вызывать SQLGetData для данных, которые уже возвращены; дополнительные сведения см. в разделе "Получение длинных данных".