C ++ предварительно определяет длину VARCHAR, используя связанные параметры ODBC - PullRequest
3 голосов
/ 07 декабря 2011

Я играл с Row-Wise, Column-Wise и привязкой параметров, чтобы найти способ указать на непоследовательный массив буферов для возврата столбца VARCHAR.

Возвращение может иметь 10 символов или 8000. Я не хочу выделять 8000 x nRows байт памяти, очевидно, поэтому я старался найти способ улучшить это.

Первый очевидный способ - выделить буфер длиной 8000 байт, а затем, как только SqlFetchO () вернет длину столбца, выделить правильный размер для возврата и copy over. Поскольку копия стоит дорого, я пытаюсь избежать этого.

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

SELECT DATALENGTH(Description) from SpecialOffer WHERE MinQty > 0

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

Есть ли способ получить точную информацию о длине столбца VARCHAR перед извлечением строки в SQL Server?

Кроме того, есть ли способ использовать указатель на указатель на буфер (т. Е. Двойная разыменование, требуемая драйвером ODBC). Это позволило бы мне использовать привязку Row-Wise и массив указателей на буферы, например (используя второй метод).

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Если вы SQLPrepare запрос, вы можете затем вызвать SQLNumResultCols, чтобы найти количество столбцов, затем SQLDescribeCol, чтобы получить длину и типы данных каждого столбца, а затем использовать эту информацию для выделения и привязки буферов данных.Затем используйте SQLExecute и SQLFetch, чтобы вернуть данные в этот буфер.

0 голосов
/ 13 декабря 2012

Ответ Necro здесь, но уже существующий не отвечает на ваш вопрос. Нет, невозможно получить фактическую длину заданного столбца в заданной длине строки до того, как драйвер получит строку.

Вам либо нужно выделить больше памяти, чем вам нужно (что может или не может быть приемлемо, в зависимости от запроса и приложения), или вам нужно использовать свой трюк DATALENGTH. Если вы решите пойти по этому пути, вам нужно будет убедиться, что ваш второй запрос точно соответствует первому - возможно, требуется условие ORDER BY в вашем первичном ключе, чтобы гарантировало , что SQL Server не ' Разбейте порядок столбцов, которые вы возвращаете между первым и вторым запросами.

Кроме того, вам может потребоваться выполнить оба запроса в одном вызове ODBC Execute. Это минимизирует количество обращений к базе данных и может принести вам немного дополнительной производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...