Реализация оболочки odbc для сервера Sql. Считывание данных базы данных в виде символов или запрос драйвера для преобразования данных в тип C - PullRequest
0 голосов
/ 07 сентября 2018

Я написал оболочку базы данных, используя odbc для связи с базой данных sql server. Это работает, но как я делаю, я читаю все типы данных в виде символов (количество символов, указанных при привязке столбца с помощью SQLBindCol) и меняю возвращаемые символы на требуемый тип данных в моем приложении.

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

Я вижу справку Microsoft по SQLBindCol, в которой указано

При извлечении данных из источника данных с помощью SQLFetch, SQLFetchScroll, SQLBulkOperations или SQLSetPos драйвер преобразует данные в этот тип

это то, что мне нужно, и я думаю, что будет эффективнее по сравнению с моим кодом (чтение всего как символы.)

sqlbindcol sqlfetch

Ниже приведен порядок вызовов функций API ODBC

  • SQLAllocHandle (для выделения дескриптора среды)
  • SQLSetEnvAttr
  • SQLAllocHandle (для выделения дескриптора базы данных)
  • SQLDriverConnect
  • SQLAllocHandle (для выделения дескриптора оператора)
  • SQLExecDirect
  • SQLBindCol
  • SQLFetch.

Каждый раз, когда я связываю столбец, я указываю TargetType как sql_char и количество символов, которые должны быть помещены в буфер приложения (* void) при вызове sqlfetch.

Когда я хочу прочитать данные, которые представляют собой большую строку (например, данные XML) и неизвестного размера, этот метод не работает.

Я хочу знать, прочитал ли я все типы данных как символы, например, как я это сделал? Как прочитать все данные в возвращаемом столбце результата, не указав количество символов, которые нужно вставить в буфер?

Я прочитал из документов, которые мы можем попросить, чтобы драйвер сделал преобразование в указанный тип C в SQLBindCol. Как этого добиться? Моя структура для хранения информации столбца

struct ColValInfo
{
    ColValInfo(): pValue(0){}

    SQLPOINTER pValue; // typedef void * SQLPOINTER;
    SQLINTEGER StrLen_or_Ind; // typedef long  SQLINTEGER;
};

pValue - пустой указатель. если драйвер хочет выполнить преобразование и вернуть данные в pValue. какие все необходимые вещи нужно сделать.

1 Ответ

0 голосов
/ 10 апреля 2019

Я думаю, что вы пропустили вызов SQLDescribeCol до SQLBindCol вызова.

Это даст вам тип столбца и размер столбца. Затем вы распределите свои буферы соответственно, используя тип C, соответствующий типу столбца SQL, и не будете преобразовывать какие-либо данные.

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