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

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Приложение ODBC имеет три параметра для выборки данных результата.

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

Второй вариант основан на SQLGetData. Приложение не использует SQLBindCol для привязки столбцов результирующего набора к переменным программы. После каждого вызова SQLFetch приложение вызывает SQLGetData один раз для каждого столбца в результирующем наборе. SQLGetData указывает драйверу передавать данные из определенного столбца результирующих наборов в определенную переменную программы и указывает типы данных столбца и переменной. Это позволяет драйверу преобразовать данные, если столбец результата и программная переменная имеют разные типы данных. Столбцы текста, ntext и изображения обычно слишком большие, чтобы поместиться в переменную программы, но их можно получить с помощью SQLGetData. Если текст, ntext или данные изображения в столбце результатов больше, чем переменная программы, SQLGetData возвращает SQL_SUCCESS_WITH_INFO и SQLSTATE 01004 (строковые данные, усекаются справа). Последовательные вызовы SQLGetData возвращают последовательные блоки данных текста или изображения . По достижении конца данных SQLGetData возвращает SQL_SUCCESS. Если SQL_ATTR_ROW_ARRAY_SIZE больше 1, то каждая выборка возвращает набор строк. Прежде чем использовать SQLGetData, необходимо сначала использовать SQLSetPos , чтобы указать определенную строку в наборе строк в качестве текущей строки.

Третий вариант — использовать сочетание SQLBindCol и SQLGetData. Например, приложение может привязать первые десять столбцов результирующего набора, а затем при каждом получении вызовите SQLGetData три раза, чтобы получить данные из трех несвязанных столбцов. Обычно это будет использоваться, если результирующий набор содержит один или несколько столбцов текста или изображения .

В зависимости от набора параметров курсора для результирующий набор приложение также может использовать параметры прокрутки SQLFetchScroll для прокрутки вокруг результирующий набор.

Избыточное использование SQLBindCol для привязки столбца результирующих наборов к переменной программы является дорогостоящим, так как SQLBindCol приводит к выделению памяти драйвером ODBC. При привязке столбца результатов к переменной привязка остается в силе, пока не вызовите SQLFreeHandle , чтобы освободить дескриптор инструкции или вызвать SQLFreeStmt с набором fOption , равным SQL_UNBIND. По завершении инструкции привязки автоматически не снимаются.

Эта логика позволяет эффективно выполнять инструкцию SELECT несколько раз с различными параметрами. Так как результирующий набор сохраняет одинаковую структуру, можно привязать результирующий набор один раз, обработать все инструкции SELECT, а затем вызвать SQLFreeStmt с набором fOption значение SQL_UNBIND после последнего выполнения. Не следует вызывать SQLBindCol , чтобы привязать столбцы в результирующем наборе без первого вызова SQLFreeStmt с параметром fOption , SQL_UNBIND чтобы освободить все предыдущие привязки.

При использовании SQLBindCol можно выполнять привязку по строкам или столбцам. Привязка параметров на уровне строк быстрее, чем привязка на уровне столбцов.

SqlGetData можно использовать для извлечения данных на основе столбцов по столбцам вместо столбцов результирующего набора привязки с помощью SQLBindCol. Если результирующий набор содержит только несколько строк, использование SQLGetData вместо SQLBindCol быстрее; в противном случае SQLBindCol обеспечивает лучшую производительность. Если данные не всегда помещают в один набор переменных, следует использовать SQLGetData вместо постоянной повторной привязки. SqlGetData можно использовать только в столбцах, которые находятся в списке выбора после привязки всех столбцов к SQLBindCol. Столбец также должен отображаться после всех столбцов, в которых вы уже использовали SQLGetData.

Функции ODBC, которые имеют дело с перемещением данных в переменные программы или из него, такие как SQLGetData, SQLBindCol и SQLBindParameter, поддерживают неявное преобразование типов данных. Например, если приложение привязывает целочисленный столбец к строковой программной переменной, драйвер автоматически преобразует данные из целочисленного в символьный тип перед тем, как поместить их в программную переменную.

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

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

Следует соблюдать осторожность при использовании SQL_C_DEFAULT для указания типа переменной C. SQL_C_DEFAULT указывает, что тип переменной C соответствует типу данных SQL столбца или параметра. Если SQL_C_DEFAULT указан для столбца ntext, nchar или nvarchar , данные Юникода возвращаются в приложение. Это может привести к возникновению различных проблем, если приложение не было настроено для обработки данных в Юникоде. Те же типы проблем могут возникать с типом данных uniqueidentifier (SQL_GUID).

Данные текста, ntext и изображения обычно слишком большие, чтобы поместиться в одну переменную программы, и обычно обрабатывается с помощью SQLGetData вместо SQLBindCol. При использовании курсоров сервера драйвер ODBC для собственного клиента SQL Server оптимизирован для передачи данных для несвязанного текста, ntext или столбцов изображений во время получения строки. Данные текста, ntext или изображения фактически не извлекаются с сервера, пока приложение не выдает SQLGetData для столбца.

Эту оптимизацию можно применить к приложениям, чтобы не отображались данные текста, ntext или изображения , пока пользователь прокручивает курсор вверх и вниз. После выбора строки приложение может вызвать SQLGetData , чтобы получить текст, ntext или данные изображения . Это сохраняет передачу данных текста, ntext или изображения для любой из строк, которые пользователь не выбирает и может сохранить передачу очень больших объемов данных.

См. также

Обработка результатов (ODBC)