Чтение dbf-файла через ODBC Foxpro драйвер

Иногда возникает потребность прочитать dbf-файл, который xbase не понимает.

В 1С предприятии есть замечательный объект XBase, при помощи которого можно читать и записывать dbf-файлы. Увы, этот объект понимает не все форматы dbf и тогда на помощь приходят ODBC-драйверы. Вот пример чтения файла c:primer.dbf с использованием  FoxPro ODBC Driver  (скачать можно отсюда: http://download.microsoft.com/download/vfoxodbcdriver/Install/6.1/W9XNT4/EN-US/VFPODBC.msi

СтрокаПодключения="DRIVER={Microsoft FoxPro VFP Driver (*.dbf)};SourceDB=C:; SourceType=DBF; Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=Yes;";
Соединение = Новый COMОбъект("ADODB.Connection");
Попытка
Соединение.Open(СтрокаПодключения);
Исключение
Сообщить("Ошибка установки соединение");
Соединение=0;
Возврат;
КонецПопытки;
НБ= Соединение.Execute("Select * from [primer]");  // здесь указывается имя файла (без расширения), а папка указывается в строке подключения
Пока НБ.EOF=0 Цикл
Поле1=НБ.Fields("FLD1").value;
Поле2=НБ.Fields("FLD2").value;
НБ.MoveNext();
КонецЦикла;
НБ=0;
Соединение=0;

 

 

17 Comments

  1. zels

    Странно -при редактировании я вижу весь текст, а при просмотре нижняя часть пропадает…

    «Хвост» такой:

    НБ= Соединение.Execute(«Select * from [primer]»);

    Пока НБ.EOF=0 Цикл

    Поле1=НБ.Fields(«FLD1»).value;

    Поле2=НБ.Fields(«FLD2»).value;

    НБ.MoveNext();

    КонецЦикла;

    НБ=0;

    Соединение=0;

    Reply
  2. Йожкин Кот

    Рекомендую использовать Microsoft OLE DB Provider for Visual FoxPro 9.0 вместо предложенного, т.к. некоторые функции поддерживаются только в нем.

    ссыль на скачивание

    http://www.microsoft.com/en-us/download/details.aspx?id=14839

    Reply
  3. Ёпрст

    и только в фоксе можно задействовать индекс в тексте запроса.

    Reply
  4. zels

    (2) Йожкин Кот, можете привести полную строку инициализации?

    Вроде нет проблемы прочитать dbf, но пришлось потратить 2 часа, чтобы получить работающий пример (то драйвера не идут, то строка иницализации дает ошибку, то кодировка не та). У меня WindowsXP, на других операционках не проверял.

    Reply
  5. Йожкин Кот

    (4) Строка инициализации для ВСЕХ провайдеров ADODB делается просто: создаем пустой файл с расширением udl, «запускаем» его и выбираем в конструкторе нужного провайдера и его настройки. Сохраняем файл, открываем его блокнотом и копируем строку инициализации.

    ЗЫ: с кодировкой могут быть проблемы только в одном случае — в заголовке файла dbf не выбран (не верно выбран) код кодировки. Самый правильный способ исправления — исправить заголовок и не нужно никаких танцев с бубном, правок системных библиотек и реестра.

    Reply
  6. Ёпрст

    (4)

        КаталогИБ = «D:BasesТорговля»; // тут свой путь воткнешь + в системе должен быть установлен vfp провайдер, вот отсюда, к примеру:
    //  http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en
    ОлеДБ = Новый COMОбъект(«ADODB.Connection»);
    Соединение = «Provider=VFPOLEDB.1;Data Source=» + КаталогИБ + «;Mode=ReadWrite;Collating Sequence=MACHINE»;
    ОлеДБ.Open(Соединение);
    Command = Новый COMОбъект(«ADODB.Command»);
    Command.ActiveConnection = ОлеДБ;
    ТекстЗапроса = »
    |select
    |  Спр.descr as Номенклатура,
    |  Спр.sp85 as Артикул,
    |  sum(Рег.sp411) as Остаток
    |from rg405 as Рег
    |left join sc84 as Спр on Спр.id = Рег.sp408
    |where Рег.period= {d ‘2012-07-01’}
    |group by Спр.descr,Спр.sp85
    |order by Спр.descr
    |»;
    Command.CommandText = ТекстЗапроса;
    RecordSet = Новый COMОбъект(«ADODB.RecordSet»);
    RecordSet = Command.Execute();
    Если not RecordSet.EOF() Тогда
    RecordSet.MoveFirst();
    Пока RecordSet.EOF() = 0 Цикл
    Сообщить(RecordSet.Fields.Item(«Номенклатура»).Value + » «+RecordSet.Fields.Item(«Артикул»).Value+» «+RecordSet.Fields.Item(«Остаток»).Value);
    RecordSet.MoveNext();
    КонецЦикла;
    КонецЕсли;

    Показать

    здесь немного неверный синтаксис запроса — не задействован индекс

    Reply
  7. yuraos

    А в чем новизна статьи?

    Есть множество статей, предлагающих читать (и писать) через ADO

    что угодно и куда угодно.

    Не мешало бы бы пару ссылок в статью вставить.

    Reply
  8. zels

    Когда мне понадобилось загрузить данные из dbf, я подумал — нет проблем (больше десятка раз грузил через xbase). А тут открываю этот dbf-файл, а в некоторых полях записано «неопределено»… Значит, надо через ODBC действовать (через ВИД не катит, т.к. конфигурация закрыта). Я не нашел в инете четкой инструкции, как подключить и загрузить данные через ODBC-драйвер (да еще и вопрос — какой драйвер использовать)! На инфостарте тоже не нашел (хотя, может, плохо искал). В общем, через два часа получил работающий вариант и решил его опубликовать, дабы другие не тратили эти два часа (они могут ох как понадобиться для другого).

    Я не претендую на приоритет или копирайт, я просто написал рецепт, который работает в определенных условиях. А статьи по ADO найти не проблема… Но когда я искал пути решения, мне нужен был именно рецепт, а не рассуждения про широкие возможности ADO, ODBC и ссылки на другие интересные статьи (я их немало прочел, даже не возьмусь кого-то особо выделить)…

    Если кто знает, дайте ссылку на аналогичную публикацию (мне и другим только польза будет). Мне кажется, статьи типа «самодостаточный рецепт» имеют право на существование. Одно дело обзорная статья, описывающая возможности технологии вообще (даже с частым примером) и другое дело — как применить эту технологию для решения этой конкретной задачи (возникают тонкости, никак не описанные в статье). Читаешь статьи, где упоминаются ADO, OLEDB, MDAC, JET4.0, ODBC и другие «страшные» слова, скачиваешь драйверы, устанавливаешь, подключаешься — и НЕ РАБОТАЕТ. Вот для тех, кому важен результат, а не процесс и разборки, я и написал эту статью.

    (7) yuraos, если у Вас есть готовый рецепт чтения dbf через ADO — напишите статью, я и другие только спасибо скажем. Тогда по словам «dbf, ODBC» будет показываться моя статья, а по «dbf, ADO» — Ваша и каждый желающий сможет быстро найти то, что ему надо.

    Reply
  9. yuraos

    (8)

    лады!

    выложи ка на ветке проблемный дбф-ник.

    а я его попробую прочитать … и ссылочку потом кину с помощью чего можно.

    Reply
  10. zels

    Прикрепил образец

    Reply
  11. yuraos

    (10)

    прочиталось на ура с первого раза!



    возвращаю назад архивчик, в котором:

    ..\_prpves.rar\_prpves

    _prpves.dbf — исходный файлец;

    1Cv81.dt — выгрузка демобазы — можно развернуть и под 8.2 (после чего конвертнуть);

    _prpves.selx — запрос для консоли, которых читает dbf-ник;

    _prpves.txt — инструкция, что делать;

    Reply
  12. yuraos

    (11)

    и обещанные ссылочки:

    http://infostart.ru/public/169973/

    http://infostart.ru/public/177179/

    Reply
  13. zels

    (11) yuraos, спасибо

    Я вижу, что Ваше решение «мощнее» и уверен — все работает правильно. Но мне кажется, что мой пример легче воспринимается для задачи «чтение dbf-файла» (хотя тут я, конечно, абсолютно субъективен) и поэтому я полагаю, что каждый вариант найдет своего пользователя.

    Увы, сейчас я даже не могу сказать — видел я эти примеры или нет (когда искал на инфостарте чтение dbf). Может, я их и видел, но они не ассоциировались с моей проблемой (когда ищешь подходящее решение среди множества ссылок, глубоко вникать просто некогда).

    Reply
  14. yuraos

    (13)

    наконец тебе шар вкатил!



    а то эти умники из тех-поддержки условие сделали:

    чтобы «минус» поставить — надо файл скачать!!!

    а у тебя и скачивать то нечего…



    вставишь ссылки на имеющиеся статьи по теме — сниму.

    Reply
  15. zels

    (14) yuraos, чихать мне на твой шар — плюсов больше, значит есть польза. Ты не меня — ты себя минусуешь.

    Reply
  16. yuraos

    (15) уважаемый, я смотрю у вас хронический насморк на коллег-разработчиков



    будемс иметь ввиду.

    Reply
  17. zels

    (16) yuraos, не надо заниматься подтасовками и подменять свой шар коллегами-разработчиками.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *