1

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

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

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

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

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

请帮忙!

4

4 回答 4

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);
}
于 2012-05-08T05:07:30.100 回答
1

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

为了尝试删除某些字符,我通常使用函数 CHRTRAN()(也就是说,如果您确实使用 Visual Foxpro Ole DB 提供程序),您可以从字面上删除许多字符(例如无效),例如...

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

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

同样,不确定您正在使用哪个本机 .DBF 文件系统,但 VFP 处理这种操作非常快。

于 2010-07-12T11:49:27.560 回答
0

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

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

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

于 2010-07-08T17:07:39.373 回答
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

于 2010-07-08T17:08:25.980 回答