Оптимальный способ обработки .dbf из C # - PullRequest
1 голос
/ 08 июля 2010

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

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 08 мая 2012

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

Вы определяете свою таблицу так, чтобы она соответствовала определению 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 голос
/ 12 июля 2010

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

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

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

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

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

0 голосов
/ 08 июля 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

0 голосов
/ 08 июля 2010

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

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

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

...