Извлечение больших данных с сервера Sql с использованием ODBC - varchar, varbinary - PullRequest
0 голосов
/ 08 октября 2018

Как я могу прочитать varchar с сервера SQL, используя собственный код C ++.Есть ли у вас какие-либо рекомендации?Каков наилучший способ сделать это?

Мое приложение (нативное c ++) позволяет пользователям писать внешние запросы Sql и использовать этот файл для извлечения некоторых данных из базы данных, которые можно использовать внутри нашего приложения.Теперь проблема в том, что клиенты могут писать запросы, которые включают в себя как маленькие (например, int), так и большие столбцы данных (для Ex varchar и varbinary), упорядоченные случайным образом.

Я использую SQLBindCol для привязки к переменным приложения. Я не могуиспользуйте этот метод для связывания больших типов данных, если я не выделю достаточно большой буфер для хранения данных (длина неизвестна при связывании).Данные могут быть любого размера (меньше максимального размера, разрешенного столбцом сервера sql), у меня есть проблемы с памятью при выделении больших буферов.Поэтому я подумал, что могу использовать SQLGetData, но я вижу ниже от Microsoft.

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

А также из этой ссылки сказано

Для универсального приложения вы можете использовать SQLFetch + SQLGetData дляполучить максимальную длину и данные.На самом деле, для очень длинного столбца (тип данных изображения) рекомендуется использовать SQLGetData, так как вы можете получать данные в чанке, вместо того, чтобы предварительно выделять большой буфер.Однако, если объем данных не так велик, вы можете использовать тип данных "varbinary (2048)

. Я могу изменить порядок столбцов выбора в запросе и использовать как sqlcolBind, так и sqlgetdata. Но яне очень убежден в этом.

Из этой ссылки переполнения стека предварительное определение длины Предлагается либо выделить больше памяти, чем нужно, либо мне пришлось выполнить два SELECTоператоры, один запрос с большим типом данных и другой запрос, чтобы получить фактический размер столбца с использованием DATALENGTH, что-то вроде

select name, description from users where username = 'johnce'
select DATALENGTH(description) from description where username = 'johnce'

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

...