Извлечение данных из древней базы FoxPro

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Извлечение данных из древней базы FoxPro

Сообщение Proxy » 12.09.2017 (Вт) 19:45

Здравствуйте.

Интересует следующий вопрос: как извлечь типы данных полей таблицы из 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), но хочется найти более красивое решение. Да и с такими объемами данных мой старый код работает слишком медленно. В крайнем случае, конечно, придётся использовать это.
Follow the white rabbit.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Изслечение данных из дравней базы FoxPro

Сообщение HandKot » 13.09.2017 (Ср) 7:50

Добрый день.
Проверить не получилось, но попробуйте использовать такой метод

Код: Выделить всё
cn.ConnectionString = ""
cn.Open
Set rs = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, "ИмяТаблицы"))
cn.Close
Set cn = Nothing


и лучше, наверное, использовать драйвер vfpoledb
I Have Nine Lives You Have One Only
THINK!

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Изслечение данных из дравней базы FoxPro

Сообщение Proxy » 13.09.2017 (Ср) 19:21

Спасибо.
Удивительно, сегодня к этому же решению пришёл :)
Да, в схеме есть данные и о "размерах" (Length) полей (явный признак, в сочетании с типом данных определяющий, какой тип данных выберет Enterprise Manager — используем аналогичные ассоциации типов). Есть также поля Precision и Scale, определяющие, какие precision и scale следует указать для numeric и decimal типов в SQL таблице (заполнены не только для numeric и decimal, но какова тут логика не совсем понятно). В общем красивое компактное решение найдено.

HandKot писал(а):и лучше, наверное, использовать драйвер vfpoledb

А с ним аналогично всё.

Вот чтива достойного не попалось, поэтому ко всему прихожу методом тыка. ODBC даёт удобный доступ к Length только для символьных типов почему-то.

P.S. И как ожидалось, чем дальше отдаляемся от самих баз данных (ODBC -> OLE DB -> ADO -> ADO.NET), тем "уродливее" выглядит извлечение типов данных из таблиц (тем меньше надежды, что типы не преобразованы).
P.P.S. Немного изучая устройство "древних" СУБД изредка встречаешь кое-какие интересные идеи, ныне не используемые.
Follow the white rabbit.


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList