Оптимальный способ обработки .dbf из C#

Какой поставщик данных я могу использовать для обновления файла .dbf с С#?

Я пробовал использовать несколько разных провайдеров .dbf для создания DataSource, но получаю следующее сообщение: «Сообщение об ошибке: ERROR HYC00 Microsoft ODBC dBase Driver Дополнительная функция не реализована».

Или, когда я создал набор данных и адаптер данных с функцией обновления, я получил: «Для обновления требуется допустимая команда UpdateCommand при передаче коллекции DataRow с измененными строками».

Если кто-нибудь знает способ работы с .dbf из C# с большим количеством обновлений, пожалуйста, помогите. Когда я пытаюсь обновить строки одну за другой, это происходит слишком медленно, потому что провайдер потеряет слишком много времени на поиск большого файла .dbf. Может быть, есть способ автоматически построить индекс, и источник данных знает, как его использовать?

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

Помоги пожалуйста!


person watbywbarif    schedule 08.07.2010    source источник


Ответы (4)


Судя по вашему комментарию о базе данных объемом ~ 1 ГБ, я тоже работаю с форматами файлов баз данных VFP (.dbf), а SQL-обновления работают без проблем через создание / выполнение OleDbCommand и могут работать с любыми собственными командами, которые запускает VFP OleDbProvider.

Для удаления некоторых символов я обычно использую функцию CHRTRAN() (то есть, если вы ДЕЙСТВИТЕЛЬНО используете Visual Foxpro Ole DB Provider), где вы можете буквально удалить многие символы (например, недопустимые), что-то вроде...

Update YourTable
   set SomeField = chrtran( SomeField, "!@#$%^*(", "" )

просмотрит ВСЕ записи и удалит любой из поля (первый параметр), любой экземпляр отдельного символа (2-й параметр) и изменит его на соответствующий символ, найденный в 3-м параметре... в этом случае нет значения, просто пустая строка, поэтому символы будут удалены. Сам по себе довольно быстрый, и вам не нужно постоянно сканировать все загружаемые, тестируемые и затем возвращаемые записи.

Опять же, неизвестно, с какой родной файловой системой .DBF вы работаете, но VFP работает очень быстро с такими манипуляциями.

person DRapp    schedule 12.07.2010

Вы можете использовать LINQ to VFP для чтения и записи в файлы DBF. Я использую его для редактирования некоторых файлов dBase III, работает отлично.

Вы определяете свою таблицу в соответствии с определением DBF следующим образом:

public partial class MyTable 
{
    public System.Int32 ID { get; set; }
    public System.Decimal Field1 { get; set; }
    public System.String Field2 { get; set; }
    public System.String Field3 { get; set; }
}

Вы определяете контекст следующим образом:

public partial class Context : DbEntityContextBase 
{
    public Context(string connectionString)
        : this(connectionString, typeof(ContextAttributes).FullName) 
    {
    }

    public Context(string connectionString, string mappingId)
        : this(VfpQueryProvider.Create(connectionString, mappingId)) 
    {
    }

    public Context(VfpQueryProvider provider)
        : base(provider) 
    {
    }

    public virtual IEntityTable<MyTable> MyTables 
    {
        get { return this.GetTable<MyTable>(); }
    }
}

Вы определяете атрибуты контекста следующим образом:

public partial class ContextAttributes : Context 
{
    public ContextAttributes(string connectionString)
        : base(connectionString) {
    }

    [Table(Name="mytable")]
    [Column(Member="ID", IsPrimaryKey=true)]
    [Column(Member="Field1")]
    [Column(Member="Field2")]
    [Column(Member="Field3")]
    public override IEntityTable<MyTable> MyTables 
    {
        get { return base.MyTables; }
    }
}

Вам также нужна строка подключения, вы можете определить ее в app.config следующим образом (в этом случае относительный путь Data\ используется в качестве источника файлов DBF):

<connectionStrings>
  <add name="VfpData" providerName="System.Data.OleDb"
    connectionString="Provider=VFPOLEDB.1;Data Source=Data\;"/>
</connectionStrings>

И, наконец, вы можете выполнять чтение и запись файлов DBF так же просто, как:

// Construct a new context
var context = new Context(ConfigurationManager.ConnectionStrings["VfpData"].ConnectionString);

// Write to MyTable.dbf
var my = new MyTable
{
    ID = 1,
    Field1 = 10,
    Field2 = "foo",
    Field3 = "bar"
}
context.MyTables.Insert(my);

// Read from MyTable.dbf
Console.WriteLine("Count:  " + context.MyTables.Count());
foreach (var o in context.MyTables)
{
    Console.WriteLine(o.Field2 + " " + o.Field3);
}
person Dejan Janjušević    schedule 08.05.2012
comment
Интересный подход, я рассмотрю его в следующий раз, когда мне это понадобится. Фала ти susjed. Живио! ;) - person watbywbarif; 08.05.2012

Ванильный OleDbConnection довольно хорошо обрабатывает DBF, если вы придерживаетесь очень простых операций SQL.

Здесь, где я работаю, мы создаем и поддерживаем приложения, которые взаимодействуют с DBF, используя исключительно классы OleDb. Однако мы не используем адаптеры или источники данных — все делается «напрямую» через OleDbCommands, OleDbDataReaders и т. д.

Возможно, адаптеры данных полагаются на функции, которые могут отсутствовать при взаимодействии с базовыми или устаревшими источниками данных, такими как xBase. Вы пробовали использовать UPDATE OleDbCommand?

person Humberto    schedule 08.07.2010
comment
Да, но обновление слишком медленное. У меня есть база ~ 1 ГБ, и мне нужно удалить некоторые символы из каждой строки, которая ее содержит. Если я делаю это построчно, это занимает слишком много времени, потому что БД не индексируется. Я должен сделать какую-то уродливую вещь, например, получить все в память, удалить все записи и заменить измененными записями. Я попытался выполнить обновление с помощью команды замены, но похоже, что Microsoft JET не поддерживает ее. Может какой-то другой провайдер делает? Теперь мне удалось выполнить обновление с заменой из Access, но я не уверен, что такое доступ? - person watbywbarif; 09.07.2010

Обычно драйвер FoxPro работает с файлами .DBF. Формат файла достаточно похож, что хорошо подходит для чтения. Писать немного сложнее. К сожалению, поскольку DBASE — очень старая технология, .NET плохо с ней работает, так что вы в значительной степени застряли со своим медленным вариантом. Поверьте мне, я чувствую вашу боль, поскольку мне приходится регулярно работать с ними для системы POS, которую мы поддерживаем.

http://www.aspcode.net/Reading-DBF-files-in-C.aspx

Подключение .NET к файлу dBase .dbf

Как читать/записывать dBase III с помощью C#/.NET ODBC или OLE?

и, наконец, мой любимый источник строк подключения:

http://www.carlprothman.net/Default.aspx?tabid=81

person David    schedule 08.07.2010
comment
Я нашел это по ссылкам на рекомендованных вами страницах: c-sharpcorner.com /uploadfile/rfederico/ Выглядит многообещающе, попробую как-нибудь в другой раз. - person watbywbarif; 09.07.2010