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


Выборка строки данных

Чтобы получить строку данных, приложение вызывает SQLFetch. SQLFetch можно вызывать с любым типом курсора, но он перемещает курсор набора строк только в направлении только вперед. SQLFetch перемещает курсор к следующей строке и возвращает данные для всех столбцов, привязанных к вызовам SQLBindCol. Когда курсор достигает конца результирующий набор, SQLFetch возвращает SQL_NO_DATA. Примеры вызова SQLFetch см. в статье Using SQLBindCol.

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

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

Для данных переменной длины, таких как символьные и двоичные данные, драйвер проверка длину преобразованных данных по длине байтов буфера, привязанной к столбцу; длина буфера указывается в аргументе BufferLength в SQLBindCol. Если длина байтов преобразованных данных превышает длину байтов буфера, драйвер усечает данные в буфере, возвращает ненадежную длину в буфере длины или индикатора, возвращает SQL_SUCCESS_WITH_INFO и помещает SQLSTATE 01004 (усеченные данные) в диагностика. Единственное исключение заключается в том, что закладка переменной длины усечена при возврате SQLFetch, которая возвращает SQLSTATE 22001 (строковые данные, усекаются право).

Данные фиксированной длины никогда не усечены, так как драйвер предполагает, что размер привязанного буфера — это размер типа данных. Усечение данных, как правило, является редким, так как приложение обычно привязывает буфер достаточно большой для хранения всего значения данных; он определяет необходимый размер из метаданных. Однако приложение может явно привязать буфер, который он знает, слишком мал. Например, он может извлекать и отображать первые 20 символов описания части или первые 100 символов длинного текстового столбца.

Символьные данные должны быть прерваны драйвером, прежде чем он будет возвращен приложению, даже если он был усечен. Символ завершения null не включается в возвращаемую длину байтов, но требует пробела в связанном буфере. Например, предположим, что приложение использует строки, состоящие из символьных данных в наборе символов ASCII, драйвер имеет 50 символов возвращаемых данных, а буфер приложения составляет 25 байтов. В буфере приложения драйвер возвращает первые 24 символа, за которым следует символ завершения null. В буфере длины или индикатора возвращается длина байта 50.

Приложение может ограничить количество строк в результирующем наборе, задав атрибут инструкции SQL_ATTR_MAX_ROWS перед выполнением инструкции, создающей результирующий набор. Например, в режиме предварительного просмотра в приложении, используемом для форматирования отчетов, требуется только достаточно данных, чтобы отобразить первую страницу отчета. Ограничив размер результирующий набор, такая функция будет выполняться быстрее. Этот атрибут инструкции предназначен для уменьшения сетевого трафика и может не поддерживаться всеми драйверами.