【问题标题】:Optimal way to handle .dbf from C#从 C# 处理 .dbf 的最佳方法
【发布时间】:2010-07-08 16:49:02
【问题描述】:

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

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

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

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

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

请帮忙!

【问题讨论】:

    标签: .net database ado.net dbf


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

      • 有趣的方法,下次需要时我会研究一下。 Fala ti susjed。齐维奥! ;)
      【解决方案3】:

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

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

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

      【讨论】:

      • 可以,但是更新太慢了。我有大约 1GB 的基础,我必须从包含它的每一行中清除一些字符。如果我逐行执行它会花费太多,因为 db 没有被索引。我必须做一些丑陋的事情,比如全部记忆,删除所有记录并用更改的记录替换。我尝试使用替换命令进行更新,但似乎 Microsoft JET 不支持它。也许其他一些提供商会这样做?现在我通过 Access 的替换成功更新了,但我不确定访问使用的是什么?
      【解决方案4】:

      通常,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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2021-02-02
      相关资源
      最近更新 更多