Я написал оболочку базы данных, используя 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. какие все необходимые вещи нужно сделать.