Чтение во всем большом объекте, размер которого вы не знаете заранее (без максимального выделения + копии), должно быть довольно распространенной проблемой, но поиск хорошей документации и / или примеров «правильного» способа сделать это доказал совершенно безумный для меня.
Я боролся с SQLBindCol
, но не мог найти хорошего способа заставить его работать. SQLDescribeCol
и SQLColAttribute
возвращают метаданные столбца, которые, по-видимому, являются значением по умолчанию или верхней границей размера столбца, а не фактическим размером текущего большого объекта. В итоге я остановился на следующем:
1) Поместите все / все столбцы больших объектов в столбцы с наибольшим номером в инструкции SELECT
2) SQLPrepare
утверждение
3) SQLBindCol
любые более ранние столбцы без больших объектов, которые вы хотите
4) SQLExecute
утверждение
5) SQLFetch
строка результатов
6) SQLGetData
в столбце больших объектов с буфером размера 0, чтобы запросить его фактический размер
7) Выделите буфер достаточно большой, чтобы вместить ваш LOB
8) SQLGetData
снова в столбце больших объектов с выделенным буфером правильного размера на этот раз
9) Повторите шаги 6-8 для каждого последующего столбца большого объекта
10) Повторите шаги 5-9 для всех остальных строк в наборе результатов
11) SQLCloseCursor
когда вы закончите с набором результатов
Это, кажется, работает для меня, но также кажется довольно сложным.
Возвращаются ли вызовы SQLGetData на сервер или просто обрабатываются результаты, уже отправленные клиенту?
Есть ли какие-либо ошибки, когда сервер и / или клиент откажутся обрабатывать очень большие объекты таким образом (например, превышен порог некоторого размера, поэтому вместо этого они генерируют ошибку)?
Самое главное, есть ли лучший способ сделать это?
Спасибо!