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

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

Я пробовал несколько разных провайдеров.dbf для создания источника данных, но я получаю сообщение, подобное этому: "Сообщение об ошибке: ОШИБКА HYC00 Microsoft ODBC dBase Driver Не реализована дополнительная функция".

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

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

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

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

4 ответа

Вы можете использовать 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);
}

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

Для того, чтобы попытаться удалить некоторые символы, я обычно использую функцию CHRTRAN() (то есть, если вы действительно используете Visual Foxpro Ole DB Provider), где вы можете буквально удалить много символов (например, недействительных) что-то вроде...

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

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

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

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

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

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

Обычно драйвер 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

Другие вопросы по тегам