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


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

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

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

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

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

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