Здравствуйте.
Интересует следующий вопрос: как извлечь типы данных полей таблицы из DBase4 и DBC (Visual FoxPro)? Подключаюсь к базе через ODBC driver-ы (Microsoft Visual FoxPro Driver и Microsoft dBASE Driver (*.dbf)).
Есть метод у Columns GetDataType, возвращает тип данных, но ассоциированный из System, не оригинальный.
Нашёл ещё способ, получаю в DBC один символ оригинального названия типа данных (C, N и т.д, для некоторых типов пустая строка почему-то), сейчас не назову какой (исходники не под рукой), для DBase4 возвращает название, но без размерности. Могу получить размерность для Char и Text типов. Кое-что как-то даже сопоставил с типами из MS SQL (как это делает Enterprise Manager, по аналогии), но есть проблема с типами данных, вроде Decimal (размер возвращается -1, но тот же Enterprise Manager при импорте таблиц импортирует их вместе с размерностями). Аналогично и с DateTime и SmallDateTime (в исходных таблицах это 2 разных типа (не знаю точно как они назывались там), в Transact-SQL переводятся, соответственно, в разные типы, но GetDataType возвращает в обоих случаях System.DateTime).
Привести всё к максимально большим типам не выйдет (задача состоит в том, чтобы копировать поведение Enterprise Manager при импорте и получить схожие таблицы). Т.е. GetDataType и та другая функция не различают DateTime и SmallDateTime.
Как корректно идентифицировать типы данных в старых таблицах посредством ODBC или OLE DB?
P.S. Кое-какой софт продолжает с давних пор помещать данные в старые базы данных (скажем, нечто из области телеметрии), по как-то причине написанные ранее jobs стали работать нестабильно (особой стабильностью и не отличались). В текущий момент приходится вручную извлекать данные на регулярной основе. Ранее я вручную парсил такие таблицы (не с этой задачей, когда-то писал свой класс для работы с DBase4 взамен драйвера от microsoft), но хочется найти более красивое решение. Да и с такими объемами данных мой старый код работает слишком медленно. В крайнем случае, конечно, придётся использовать это.