Оптимальный способ обработки.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?
и, наконец, мой любимый источник для строк подключения: