Мне нужно добавить еще один ответ на ваш комментарий, Tsahi. Я не совсем уверен, хотя я все еще неправильно понимаю вас. Возможно, объяснение того, как я это делаю в интерпретаторе SQL на базе ODBC, проливает свет на этот вопрос.
SQLPrepare() на строку, содержащую, скажем, "SELECT * FROM обув", возвращает SQL_SUCCESS, и проходящее дескриптором становится действительным.
SQLNumResultCols (& stmt, & colcount) в этом дескрипторе инструкции возвращает количество столбцов во втором параметре.
В цикле for от 0 до (colcount-1) я вызываю SQLDescribeCol(), чтобы получить, помимо прочего, размер столбца - это то, сколько байтов я должен был бы выделить для извлечения самое большое возможное возникновение для этой колонки.
Я выделяю достаточно памяти, чтобы иметь возможность выбирать блок строк вместо одной строки в последующем вызове SQLFetchScroll(). Например, блок из 10 000 строк. Для этого мне нужно выделить для каждого столбца в colcount в 10 000 раз максимальный возможный выборный размер. Плюс двухбайтовое целое число для индикатора Null для каждого столбца. Эти два: выделенная область данных и область нулевого индикатора, для 10 000 строк в моем примере, делают размер буфера выборки, другими словами, размер буфера результата.
Для подготовленного дескриптора инструкции я вызываю SQLSetStmtAttr(), чтобы установить SQL_ATTR_ROW_ARRAY_SIZE в 10 000 строк.
SQLFetchScroll() вернет либо 10000 строк в один вызов, либо, если таблица foo содержит меньше строк, все строки в foo.
Вот как я понимаю это, чтобы работать.
Вы можете сделать математику наоборот:
Вы установите максимальные выборки буфера.
Вы готовите и описываете инструкцию и столбцы, как описано выше.
Для каждого столбца вы подсчитываете два байта для нулевого индикатора и максимально возможный размер выборки из SQLDescribeCol(), чтобы получить сумму байтов для одной строки, которая должна быть выделена.
Вы целых разделите буфер максимальной выборки на сумму байтов для одной строки.
И вы используете этот результат целочисленного деления для вызова SQLSetStmtAttr() для установки SQL_ATTR_ROW_ARRAY_SIZE.
Надеюсь, что это имеет смысл ...
Вы уверены, что это не во время выполнения? из описания ResultBufferSize это звучит для меня, как будто я должен получить меньший набор результатов, а затем я должен снова попросить следующий фрагмент – Tsahi