Интерпретация OleDb числового представления базы данных (20, 0) с использованием собственного C ++ - PullRequest
0 голосов
/ 10 мая 2019

Контекст: Я расширяю старое консольное приложение, которое используется для SQL-запросов к SQL-серверу и для сохранения результата SELECT в таблице DBF.Приложение написано на родном C ++.Он включает в себя oledb.h и использует документированные объекты ATL (atldbcli.h)

CCommand<CManualAccessor, CRowset> cmd;
CTable<CManualAccessor, CRowset> dstTable;

Затем общий буфер выделяется и совместно используется исходной таблицей и dstTable.Соответствующее связывание столбцов с частями буфера выполняет преобразование при копировании в таблицу назначения.Пока все хорошо.

Что мне нужно: Мне нужно реализовать расширение, где интерпретируется содержимое исходной таблицы.Значения строки из исходной таблицы следует использовать для построения другой команды SQL SELECT.Нет проблем со строками.Однако мне нужно получить значение поля, которое определено как NUMERIC(20, 0) в базе данных.Тип столбца действительно DBTYPE_NUMERIC, colInfo.bPrecision показывает 20, а colInfo.bScale - ноль.Длина части буфера составляет 19 байт

Содержимое буфера: Буфер для поля показывает значение

04 00 01 10 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Я знаю, что точное значениеполе должно быть 7440, то есть 0x1d10.Я вижу это с четвертого байта буфера.Для быстрого и грязного взлома я могу получить значение;Тем не менее, я хотел бы понять детали, чтобы реализовать это красиво для любых NUMERIC(x, y) ...

Что говорят первые три байта?Есть ли готовые к использованию функции в oledb.h или atldbcli.h для получения значения?

...