Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложение 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 или изображения для любой из строк, которые пользователь не выбирает и может сохранить передачу очень больших объемов данных.