Размер данных, полученных из SQL-запроса через ODBC API - PullRequest
0 голосов
/ 09 декабря 2008

Кто-нибудь знает, как я могу получить количество элементов (строк * столбцов), возвращаемых после выполнения запроса SQL? Если это невозможно, то есть ли что-то, что будет относительно репрезентативным для размера данных, которые я получаю?

Я пытаюсь создать строку состояния, которая показывает, какую часть возвращенных данных я обработал, поэтому я хочу быть где-то относительно близко. Есть идеи?

Обратите внимание, что SQLRowCount возвращает только количество строк, затронутых оператором UPDATE, INSERT или DELETE; не количество строк, возвращаемых из инструкции SELECT (насколько я могу судить). Поэтому я не могу умножить это непосредственно на SQLColCount.

Мой последний вариант - иметь строку состояния, которая перемещается назад и вперед, показывая, что данные обрабатываются.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2008

Это часто проблема, когда вы хотите зарезервировать динамическую память для хранения всего набора результатов.

Один из методов заключается в том, чтобы возвращать счет как часть набора результатов.

WITH
data AS
(
    SELECT interesting-data
    FROM   interesting-table
    WHERE  some-condition
)
SELECT COUNT(*), data.*
from data

Если вы не знаете заранее, какие столбцы вы выбираете или используйте *, как в примере выше, тогда количество столбцов можно выбрать из таблицы USER_TAB_COLS

SELECT COUNT(*)
FROM USER_TAB_COLS
WHERE TABLE_NAME = 'interesting-table'
0 голосов
/ 15 января 2009

SQLRowCount может возвращать количество строк для запросов SELECT, если драйвер поддерживает это. Однако многие драйверы этого не делают, потому что это может дорого обойтись серверу. Если вы хотите гарантировать, что у вас всегда есть счетчик, вы должны использовать COUNT (*), что вынуждает сервер выполнять потенциально трудоемкие вычисления (или заставляет его задерживать возврат любых результатов, пока не будет известен весь результат).

Мое предложение было бы попытаться использовать SQLRowCount, чтобы сервер или драйвер могли решить, легко ли вычисляется число строк. Если он возвращает значение, умножьте его на результат из SQLNumResultCols. В противном случае, если он возвращает -1, используйте строку состояния «вперед-назад». Иногда это лучше, потому что вы можете казаться более отзывчивым к пользователю.

...