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

问题描述 投票:0回答:4

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

我尝试了一些不同的 .dbf 提供程序来创建数据源,但收到如下消息: “错误消息:错误 HYC00 Microsoft ODBC dBase 驱动程序可选功能未实现。”

或者当我生成一个数据集和一个具有更新功能的数据适配器时,我得到:“当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand。”

如果有人知道从 C# 处理 .dbf 的方法并进行了大量更新,请提供帮助。当我尝试逐行更新时,速度太慢,因为提供程序会在搜索大 .dbf 文件时浪费太多时间。也许有一种方法可以自动构建索引并且数据源知道使用它?

另一种方法是将所有内容加载到数据集之类的内容中,并在所有更改完成后进行更新,但更新部分目前不起作用。

请帮忙!

.net database ado.net dbf
4个回答
2
投票

您可以使用 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
投票

从您关于〜1GB数据库的评论来看,我也使用VFP数据库(.dbf)文件格式,并且SQL更新通过OleDbCommand创建/执行没有问题,并且可以使用VFP OleDbProvider运行的任何本机命令。

为了尝试删除某些字符,我通常使用函数 CHRTRAN() (也就是说,如果您确实使用 Visual Foxpro Ole DB Provider),您可以在其中逐字删除许多字符(例如无效字符),例如...

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

将遍历所有记录并从字段(第一个参数)中删除任何单个字符(第二个参数)的实例,并将其更改为在第三个参数中找到的相应字符...在这种情况下,没有值,只是空字符串,因此字符将被删除。本身速度相当快,您不必不断扫描所有正在下载、测试然后推回的记录。

同样,不确定您正在使用哪种本机 .DBF 文件系统,但 VFP 通过此类操作速度非常快。


0
投票

如果您坚持使用非常基本的 SQL 操作,普通的

OleDbConnection
可以很好地处理 DBF。

在我工作的地方,我们构建和维护仅使用 OleDb 类与 DBF 交互的应用程序。然而,我们不使用适配器或数据源——一切都是通过 OleDbCommands、OleDbDataReaders 等“直接”完成的。

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

UPDATE
OleDbCommand?


0
投票

通常,FoxPro 驱动程序使用 .DBF 文件。文件格式非常相似,非常适合阅读。写作有点棘手。不幸的是,由于 DBASE 是一项非常古老的技术,.NET 并不能很好地使用它,因此您几乎只能使用缓慢的选项。相信我,我能感受到您的痛苦,因为我必须定期使用这些来维护我们支持的 POS 系统。

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

.NET 连接到 dBase .dbf 文件

如何使用 C#/.NET ODBC 或 OLE 读取/写入 dBase III 文件?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.