从C#处理.dbf的最佳方法

时间:2010-07-08 16:49:03

标签: .net database ado.net dbf

我可以使用哪种数据提供程序从C#更新.dbf文件?

我尝试了几个不同的.dbf提供程序来创建一个DataSource但是我收到这样的消息: “错误消息:错误HYC00 Microsoft ODBC dBase驱动程序可选功能未实现。”

或者当我使用更新函数生成数据集和dataadapter时,我得到:“在传递带有修改行的DataRow集合时,Update需要有效的UpdateCommand。”

如果有人知道某些方法可以使用C#中的.dbf进行大量更新,请提供帮助。当我尝试逐个更新行时,它太慢,因为提供程序将在搜索大型.dbf文件时损失太多时间。也许有一种方法可以自动构建索引并且数据源知道要使用它吗?

另一种方法是在完成所有更改后将all加载到数据集和更新之类的内容,但更新部分暂时不起作用。

请帮忙!

4 个答案:

答案 0 :(得分:1)

从大约1GB的数据库中,我也使用VFP数据库(.dbf)文件格式,而SQL-Updates通过OleDbCommand创建/执行没有任何问题,并且可以使用VFP OleDbProvider运行的任何本机命令。 / p>

为了尝试删除一些字符,我通常使用函数CHRTRAN()(也就是说,如果你使用Visual Foxpro Ole DB Provider),你可以在字面上删除许多字符(例如无效)...

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

将遍历所有记录并从字段中剥离任何记录(第一个参数),任何单个字符的实例(第2个参数),并将其更改为在第3个参数中找到的相应字符...在这种情况下,没有值,只是一个空字符串,所以字符将被删除。本身速度非常快,您无需继续扫描所有正在下载,测试和推回的记录。

同样,对于您正在使用的本机.DBF文件系统并不是肯定的,但VFP在这种操作方面非常快。

答案 1 :(得分:1)

您可以使用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);
}

答案 2 :(得分:0)

如果您坚持使用非常基本的SQL操作,那么vanilla OleDbConnection可以很好地处理DBF。

在这里我工作,我们建立&amp;使用专门的OleDb类维护与DBF交互的应用程序。但是,我们不使用Adapters或DataSources - 所有内容都是通过OleDbCommands,OleDbDataReaders等“直接”完成的。

也许DataAdapter依赖于与基本或遗留数据源(如xBase)交互时可能不存在的功能。您是否尝试过使用UPDATE OleDbCommand?

答案 3 :(得分:0)

通常,FoxPro驱动程序使用.DBF文件。文件格式足够相似,以便于阅读。写作有点棘手。不幸的是,由于DBASE是一项如此古老的技术,.NET并不能很好地使用它,所以你几乎坚持使用慢速选项。相信我,我感到很痛苦,因为我必须定期为我们支持的POS系统工作。

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

.NET Connection to dBase .dbf file

How to read/write dBase III files using C#/.NET ODBC or OLE?

最后,我最喜欢的连接字符串来源:

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