Всем доброго времени суток, дорогие читатели блога. В сегодняшней статье я расскажу про доступ к DBF-файлам (таблицам) различными способами. Я столкнулся с такой проблемой, когда мне необходимо было осуществить доступ к DBF-таблицам FoxPro. Пробовал через BDE, не получалось, только к таблицам Paradox (dbf), в итоге решил попробовать через компонент TDBF –также обернулась неудачей. По старинке решил попробовать подключиться через ADO и все пошло как по маслу.
Поэтому, в данной статье я расскажу, как можно подключиться к таблицам DBF тремя способами:
- С помощью BDE – для таблиц FoxPro у меня данный вариант не прошел
- С помощью ADO – отлично открылись таблицы FoxPro
- С помощью компонента TDBF – хорошо открывает таблицы Paradox с различными кодировками или же dBase.
Если честно, то я вообще не могу терпеть BDE, но пришлось поработать с такими таблицами и первый вариант, через который я хотел подключиться к ним – это использование именно BDE, что, в принципе у меня это получилось, то есть получилось забрать список таблиц, чему я обрадовался и подумал, что дальше все пойдет, как положено, но не тут-то было. При попытке подключение к какой-нибудь таблице, мне выдавало ошибку, что-то наподобие:
Я пробовал его устанавливать и в самое BDE Administrator и при подключении, но ничего не вышло. Зато таким способам у меня отлично подключалось к таблицам DBF – Paradox, например dBase.
Поэтому, устанавливаем на форму следующие компоненты со вкладки BDE:
- TTable или TQuery
- По желанию можно TDataSourceи TDbGrid
Далее в свойстве DatabaseName компонента TDataBase задаем имя БД, я написал – MyDB,а в свойстве DriverName того же компонента я выбрал из выпадающего списка STANDART. Свойство LoginPromt устанавливаем в False, так как логина и пароля на наших таблицах никакого не стоит. В свойстве Params задаем параметры подключения, я указал только путь к нашим таблицам:
Можно также двойным щелчком нажать по компоненту TDataBase и настроить необходимое подключение и устанавливаем свойство Connected в True, в итоге должно произойти подключение к таблицам, без всяких ошибок. Здесь все, переходим к компоненту TTable, где в свойстве DatabaseName указываем имя нашей БД, то есть MyDB. В свойстве TableType выбираем тип таблиц, я указал – ttDBase, а в свойстве TableName выбираем имя таблицы, после чего устанавливаем свойство Active в True. Все, подключает у меня отлично, таблицу отображает также отлично.
Но такой вариант у меня не прошел с таблицами FoxPro, о чем я говорил выше. Поэтому, чтобы решить свою проблему, я решил использовать технологию ADO. Поэтому с вкладки ADO я установил следующие компоненты:
- TADOConnection
- TADOQuery или TADOTable
- По желанию можно установить TDataSource и TDBGrid
Далее нам необходимо просто создать подключение, которое мы делали для базы MS Access, оно будет отличаться тем, что мы выбираем другого поставщика данных, а именно Microsoft Visual FoxPro ODBC. Все, далее указываем кодировку и путь к таблицам. Если это таблицы FoxPro, то в папки должен присутствовать файл со списком всех таблиц, расширения *.dbc. То есть, строка подключения компонента TADOCOnnection будет выглядеть, примерно следующим образом:
Связываем компонент TADOConnection с TADOTable или TADOQuery и работает с нужными нам таблицами.
Еще один вариант – это работа с таблицами dbf-формата, с помощью компонента TDBF, который, я использую в проекте . Если честно, я хочу от него отказаться, просто он хорошо работает с кодировками. Рассказывать, как с ним работать, я не буду, а просто оставлю ссылку для примера.
Сегодня, наверное, никому не нужно говорить о том, что достаточно часто многие пользователи сталкиваются с файлами, имеющими расширение.dbf. Что самое печальное, в ОС Windows даже при наличии установленного пакета Microsoft Office данному типу файлов не сопоставлена ни одна программа. Имеем его, мы сейчас и попытаемся разобраться. Заодно посмотрим, как можно установить ассоциацию расширения для последующего автоматического распознавания данных и открытия искомого файла.
Формат DBF: описание
Собственно, из самого сокращения, применяемого к расширению файла такого типа, уже можно сделать вывод о том, что это база данных. Она является несколько специфичной, поскольку обычно такие файлы имеют расширение
В данном случае мы имеем другой который, правда, несмотря на свою специфичность, распознается многими программами, поддерживающими работу с информацией такого типа. Это может быть тот же Excel или Access, входящие в состав основного пакета Microsoft Office, или любые другие офисные приложение от сторонних разработчиков.
Чем открывать DBF в стандартном варианте
На самом деле, если вы вдруг встретили файл такого типа (иконка даже в «Проводнике» на нем не используется), не стоит впадать в панику. Совершенно элементарно его можно открыть при помощи программы Excel, поскольку именно в ней сохраняется вся логическая структура и с учетом тех же и возможности применения стандартной системы поиска.
Поскольку самому файлу в стандартном варианте не сопоставлена ни одна программа, поступить можно двумя способами. Рекомендуется, допустим, просто запустить программу Excel или Access, а затем использовать стандартное меню открытия файла или сочетание клавиш Ctrl + O. Правда, в появившемся меню в поле типов файлов следует указать «Все файлы» (а не «родной» формат), после чего выбрать искомый файл. Будьте уверены: любая табличная программа распознает этот тип данных без всяких проблем.
Как уже понятно, проблема, чем открывать DBF-файл, в нашем случае сводится только к использованию стандартного офисного приложения в ручном режиме. Как уже понятно, такой способ не всегда удобен и требует определенных затрат по времени.
Сопутствующие программы
Теперь посмотрим на сам файл DBF. Чем открыть его без использования программ стандартного офисного пакета? Да теми же утилитами, входящими в состав аналогичных программных продуктов.
К примеру, это может быть тот же Open Office, Lotus и т. д. В принципе, особой разницы здесь нет, поскольку роль играет только то, что применяемая программа способна работать с табличными электронными данными. Чтение формата DBF во всех случаях производится абсолютно одинаково. Кстати, это не зависит от разработчика офисного пакета, поскольку у всех имеется поддержка данных такого типа, включая даже платформы типа Oracle.
Изменение параметров открытия по умолчанию
А сейчас посмотрим, чем открывать DBF-файлы так, чтобы использовался автоматический режим. В простейшем случае делается это из субменю, вызываемого правым кликом на файле в обычном «Проводнике», где выбирается команда «Открыть с помощью…».
Для единичного случая используется одно из приложений, указанных в списке. Для того чтобы повторно не ломать себе голову насчет того, чем открывать DBF-файлы, можно просто указать выбранное приложение, а затем снизу поставить «птичку» напротив строки «Использовать для всех файлов такого типа». Тот же Excel в дальнейшем (если он выбран в качестве программы по умолчанию) будет открывать файл этого типа при обычном двойном клике.
Само собой разумеется, что вместо приложения Excel можно выбрать тот же Access или другие программы, способные распознавать и открывать данные такого типа. Суть не в этом. Главное - настроить автоматическое открытие базы данных. Ну а с чем работать в плане программного обеспечения, это уже дело каждого конкретного пользователя компьютерной системы.
Что в итоге?
Подводя итог, стоит сказать, что оптимальным вариантом при открытии файлов такого типа является, естественно, офисный пакет от корпорации Microsoft, поскольку именно он является наиболее распространенным во всем мире. Правда, нет и ничего страшного в том, что юзер, не использующий продукцию Microsoft, откроет данные этого типа в любом другом приложении.
Как уже понятно из всего вышесказанного, табличные редакторы присутствуют практически во всех сегодня известных пакетах. Разниться между собой они могут разве что по называнию, а уж никак не по функциональному набору, который, как правило, везде одинаков, за редким исключением.
Кроме всего прочего, соответственно, можно использовать и многие средства разработки с применением достаточно большого количества языков программирования. На той же платформе, поддерживающей создание и оптимизацию SQL-серверов, такие файлы открываются, что называется, в момент. При открытии они будут иметь достаточно специфичный вид, что обычному юзеру несколько непривычно. Впрочем, большинство пользователей вряд ли станут применять такие профессиональные средства разработки, и ограничатся только стандартным программным набором.
DBF – широко распространенный формат хранения данных, появившийся в 80-х годах прошлого века. Впервые формат применялся в семействе СУБД dBase. В связи с популярностью и широким распространением dBase, было создано множество dBase-подобных программных продуктов, получивших собирательное название xBase. Несмотря на значительный возраст формата, он до сих пор достаточно широко используется. В данной статье рассматриваются способы работы с DBF из «1С:Предприятие».
В «1С:Предприятие» для работы с файлами формата DBF(версия dBase III) применяется специальный программный объект – xBase. Работа с этим объектом обычно не вызывает трудностей.
Внимание!
При работе с файлами DBF следует помнить, что имя файла должно удовлетворять ограничению 8.3.
Внимание!
Объект xBase доступен как на стороне клиента, так и на стороне сервера. Следует продумывать клиент-серверное взаимодействие при решении каждой конкретной задачи.
Чтение файла DBF
Чтение данных из файла DBF производится за несколько последовательных этапов:
- Создание объекта XBase;
- Открытие файла;
- Последовательный перебор всех строк файла и считывание значений полей;
- Закрытие файла.
Можно использовать несколько измененный алгоритм перебора строк файла:
Пока НЕ ДБФ . ВКонце () Цикл Сообщить(ДБФ. NAME); ДБФ. Следующая (); КонецЦикла;Выгрузка в файл DBF
Этапы выгрузки в файл DBF:
- Создание объекта XBase;
- Указание кодировки (если не указать, то будет использоваться кодировка ANSI);
- Описание полей;
- Создание файла;
- Цикл с добавлением и заполнением строк;
- Закрытие файла.
Рассмотрим этот процесс на примере:
ДБФ = Новый XBase; // Этап 1. Создание объекта XBase ДБФ. Кодировка = КодировкаXBase. OEM; // Этап 2. Указание кодировки ДБФ. Поля. Добавить("CODE" , "S" , 9 ); // Этап 3. Описание имени и типа поля ДБФ. Поля. Добавить("NAME" , "S" , 40 ); ДБФ. СоздатьФайл("D:\MyFile.dbf" ); // Этап 4. Создание файла Выборка = Справочники. Номенклатура. Выбрать(); Пока Выборка. Следующий() Цикл ДБФ. Добавить(); // Добавление строки ДБФ. CODE = Выборка. Код; // Заполнение значения поля ДБФ. NAME = Выборка. Наименование; ДБФ. Записать(); // Запись строки КонецЦикла; ДБФ. ЗакрытьФайл (); // Этап 6. Закрытие файлаПри указании кодировки используется тип КодировкаXBase , который может принимать два значения:
- ANSI – формат Windows;
- OEM – формат DOS.
Добавление нового поля при описании структуры имеет синтаксис
Добавить(< Имя>, < Тип>, < Длина>, < Точность>)Доступны следующие типы:
- «N» – число;
- «S» – строка;
- «D» – дата;
- «L» – булево;
- «F» – аналогично «N» – число.
Длина поля является обязательным для типов полей «N», «F» и «S».
Работа с индексами
Совместно с файлом DBF может использоваться индексный файл, в котором может содержаться информация об одном или более индексе. Наличие индексов делает возможным использование поиска, а не только последовательного перебора всех строк файла.
При создании индексного файла следует задать:
- Перечень индексов;
- Путь сохранения индексного файла (на этапе 4 выгрузки).
Пример создания индексного файла:
ДБФ. Индексы. Добавить("INDCODE" , "CODE" ); ДБФ. СоздатьФайл ("D:\MyFile.dbf" , "D:\index.cdx" );Процедура добавления нового индекса имеет синтаксис:
Добавить(< Имя>, < Выражение>, <Уникальность>, < Убывание>, < Фильтр >)Для использования индексов при чтении из файла DBF следует:
- Указать путь к индексному файлу (на этапе 2 загрузки);
- Задать текущий индекс.
Пример открытия файла DBF с использованием индексного файла:
ДБФ. ОткрытьФайл("D:\MyFile.dbf" , "D:\index.cdx" ); ДБФ. ТекущийИндекс = ДБФ. Индексы. INDCODE ;Внимание!
При открытии файла DBF позиционирование происходит на первой записи в файле. Первая запись в файле не соответствует первой записи в индексе. В связи с этим при использовании индексов перед тем, как последовательно обходить строки, необходимо спозиционироваться на первой строке индекса. Это можно сделать методом Первая () , например:
ДБФ . Первая ();Для поиска может использоваться одна из двух функций:
- Найти(< Ключ>, < Режим >) ;
- НайтиПоКлючу(< Режим >) .
В результате работы обоих функций возвращается значение с типом булево (найдена запись с указанными условиями или нет). В случае успешного поиска текущий указатель устанавливается на найденной строке. В качестве режима поиска может использоваться одно из значений:
- «>=»;
- «>»;
- «<=»;
- «<«.
Рассмотрим поиск в файле DBF на примерах:
ДБФ = Новый XBase; ДБФ. ОткрытьФайл("D:\MyFile.dbf" , "D:\index.cdx" ); // При открытии файла DBF дополнительно указывается индексный файл ДБФ. ТекущийИндекс = ДБФ. Индексы. INDCODE; // Установка текущего индекса // поиск методом Найти: Если ДБФ. Найти("000000003" , "=" ) Тогда Сообщить( + ДБФ. NAME); Иначе Сообщить("Не найдено" ); КонецЕсли; // поиск методом НайтиПоКлючу: ДБФ. Ключ. CODE = "000000002" ; Если ДБФ. НайтиПоКлючу("=" ) Тогда Сообщить("Найдено. Наименование элемента: " + ДБФ. NAME); Иначе Сообщить("Не найдено" ); КонецЕсли; ДБФ. ЗакрытьФайл ();Удаление записей в файле DBF
Удаление записи производится методом Удалить () :
ДБФ. Удалить ();Но при использовании этого метода запись не удаляется из файла безвозвратно, ей присваивается пометка удаления. При переборе строк помеченные на удаление записи пропускаются. Если необходимо обойти весь файл, включая помеченные на удаление записи, необходимо присвоить значение Истина свойству ОтображатьУдаленные объекта xBase. Узнать помечена запись на удаление или нет можно с помощью функции ЗаписьУдалена () . Для снятия пометки удаления используется метод Восстановить () .
ДБФ. ОтображатьУдаленные = Истина; Пока НЕ ДБФ. ВКонце() Цикл Если ДБФ. ЗаписьУдалена() Тогда ДБФ. Восстановить(); КонецЕсли; ДБФ. Следующая (); КонецЦикла;Для непосредственного удаления помеченных записей используется метод Сжать () :
ДБФ. Сжать ();Если необходимо удалить все записи в файле непосредственно, то можно использовать метод ОчиститьФайл () :
ДБФ. ОчиститьФайл ();Загрузка из DBF при помощи ADO
Для работы с файлами DBF может использоваться технология ADO. Драйверы ADO входят в состав операционной системы Windows и дополнительно их устанавливать не надо.
Рассмотрим пример кода для чтения из файла DBF по технологии ADO:
АДО = Новый COMОбъект("ADODB.Connection" ); // Создание COM-объекта АДО. Open("Provider=Microsoft.Jet.OLEDB.4.0; |Data Source=""D:\""; |Extended Properties=DBASE III" ); БД = АДО. Execute("Select * from MyFile" ); // запрос с получением всех записей из файла MyFile.DBF Пока БД. EOF= 0 Цикл //Цикл по записям файла DBF Сообщить(БД. Fields("Name" ). value); // Пример обращения к значению поля БД. MoveNext(); //Переходим к следующей записи КонецЦикла; АДО. Close();В приведенном примере используется строка подключения «Provider=Microsoft.Jet.OLEDB.4.0;Data Source= «D:\»;Extended Properties=DBASE III». В этой строке:
- Provider – это используемый драйвер;
- Data Source – путь, где находится файл DBF. Путь указывается с точностью до каталога. Имя файла используется в качестве имени таблицы в запросах;
- Extended Properties – в случае обращения к файлам DBF является обязательным параметром. Можно указать формат файла
Внимание!
При чтении указанным способом кодировка по-умолчанию – OEM. Для того, чтобы изменить кодировку на ANSI необходимо в реестре Windows присвоить параметру HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\xBase\DataCodePage значение «ANSI».
Возможно, этот код из может помочь:
Public Function Import(dsnName As String, sourceTableName As String, targetTableName As String) ‘ if the table already existsm, delete it. On Error GoTo CopyTable DoCmd.DeleteObject acTable, targetTableName CopyTable: DoCmd.TransferDatabase _ acImport, _ "ODBC Database", _ "ODBC;DSN=" + dsnName, _ acTable, _ sourceTableName, _ targetTableName End FunctionФункция VB, которую вам нужно поставить в MS Access довольно просто, и в основном вызывает TransferDatabase метод, передавая ему DSN (указывающий к исходной базе данных), источник имя таблицы и имя целевой таблицы. код выглядит следующим образом:
object accessObject = null; try { accessObject = Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application")); accessObject.GetType().InvokeMember("OpenCurrentDatabase", System.Reflection.BindingFlags.Default System.Reflection.BindingFlags.InvokeMethod, null, accessObject, new Object { "AccessDbase.mdb" }); accessObject.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default System.Reflection.BindingFlags.InvokeMethod, null, accessObject, new Object { "Import", "DSN Name", "Source table name", "Target table name" }); accessObject.GetType().InvokeMember("CloseCurrentDatabase", System.Reflection.BindingFlags.Default System.Reflection.BindingFlags.InvokeMethod, null, accessObject, null); MessageBox.Show("Copy succeeded."); } catch (Exception ex) { string message = ex.Message; while (ex.InnerException != null) { ex = ex.InnerException; message += "\r\n----\r\n" + ex.Message; } MessageBox.Show(message); } finally { if (accessObject != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(accessObject); accessObject = null; } }И затем код С#:
Изменение VBA для чтения acLink, а не acImport, должно позволить связывание.
Редактировать комментарии
Я не могу помочь с С#, но вот какой-то VBScript, который связывает таблицу с один MDB к другому.
StrLinkFile = "C:\Docs\Link.mdb" strAccessFile = "C:\Docs\LTD.mdb" "Create Link... " Set cn = CreateObject("ADODB.Connection") cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strAccessFile & ";" & _ "Persist Security Info=False" Set adoCat = CreateObject("ADOX.Catalog") Set adoCat.ActiveConnection = cn Set adoTbl = CreateObject("ADOX.Table") Set adoTbl.ParentCatalog = adoCat adoTbl.Name = "LinkTable" adoTbl.properties("Jet OLEDB:Link Datasource") = strLinkFile adoTbl.properties("Jet OLEDB:Link Provider String") = "MS Access" adoTbl.properties("Jet OLEDB:Remote Table Name") = "Table1" adoTbl.properties("Jet OLEDB:Create Link") = True "Append the table to the tables collection " adoCat.Tables.Append adoTbl
Возможно, этот код из могут помочь:
Public Function Import(dsnName As String, sourceTableName As String, targetTableName As String) ‘ if the table already existsm, delete it. On Error GoTo CopyTable DoCmd.DeleteObject acTable, targetTableName CopyTable: DoCmd.TransferDatabase _ acImport, _ "ODBC Database", _ "ODBC;DSN=" + dsnName, _ acTable, _ sourceTableName, _ targetTableName End FunctionФункция VB, которую вам нужно будет поставить в MS Access довольно просто, и в основном вызывает TransferDatabase метод, передавая ему DSN (указывающий к исходной базе данных), источник имя таблицы и имя целевой таблицы. код выглядит следующим образом:
object accessObject = null; try { accessObject = Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application")); accessObject.GetType().InvokeMember("OpenCurrentDatabase", System.Reflection.BindingFlags.Default System.Reflection.BindingFlags.InvokeMethod, null, accessObject, new Object { "AccessDbase.mdb" }); accessObject.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default System.Reflection.BindingFlags.InvokeMethod, null, accessObject, new Object { "Import", "DSN Name", "Source table name", "Target table name" }); accessObject.GetType().InvokeMember("CloseCurrentDatabase", System.Reflection.BindingFlags.Default System.Reflection.BindingFlags.InvokeMethod, null, accessObject, null); MessageBox.Show("Copy succeeded."); } catch (Exception ex) { string message = ex.Message; while (ex.InnerException != null) { ex = ex.InnerException; message += "\r\n----\r\n" + ex.Message; } MessageBox.Show(message); } finally { if (accessObject != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(accessObject); accessObject = null; } }И затем код C #:
Изменение VBA для чтения acLink, а не acImport, должно позволить связывание.
Изменить комментарии
Я не могу помочь с , но вот несколько VBScript, который связывает таблицу с один MDB к другому.
StrLinkFile = "C:\Docs\Link.mdb" strAccessFile = "C:\Docs\LTD.mdb" "Create Link... " Set cn = CreateObject("ADODB.Connection") cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strAccessFile & ";" & _ "Persist Security Info=False" Set adoCat = CreateObject("ADOX.Catalog") Set adoCat.ActiveConnection = cn Set adoTbl = CreateObject("ADOX.Table") Set adoTbl.ParentCatalog = adoCat adoTbl.Name = "LinkTable" adoTbl.properties("Jet OLEDB:Link Datasource") = strLinkFile adoTbl.properties("Jet OLEDB:Link Provider String") = "MS Access" adoTbl.properties("Jet OLEDB:Remote Table Name") = "Table1" adoTbl.properties("Jet OLEDB:Create Link") = True "Append the table to the tables collection " adoCat.Tables.Append adoTbl