【问题标题】:How to read/write dBase III files using C#/.NET ODBC or OLE?如何使用 C#/.NET ODBC 或 OLE 读取/写入 dBase III 文件?
【发布时间】:2010-09-09 16:41:43
【问题描述】:

我已经搜索了有关如何通过 C#/.NET 使用 OLEDB 或 ODBC 读取/写入 dBase III (dbf) 文件的各种技术。我已经尝试了几乎所有发布的技术,但没有成功。有人能指出我正确的方向吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: c# .net dbf dbase


    【解决方案1】:

    我提供了很多关于使用数据库文件的答案(更具体地说是 VFP,但 Microsoft VFP OleDb 提供程序会识别较旧的 dbase 文件。您可以通过以下方式进行搜索以找到更多这些链接:

    用户:74195[vfp][oledb]

    首先,我会先下载Microsoft VFP OleDb Provider

    接下来,如果您已经有一些 dbf 文件要尝试连接以进行测试,则需要建立连接。连接必须指向文件所在的 PATH,而不是特定的 .dbf 文件。因此,如果您有一个包含 20 个表的文件夹,一旦您连接到 PATH,您可以通过标准 VFP-SQL 语法从任何/所有表中查询(与许多 sql 的整体结构相同,但根据某些功能而有所不同像字符串、日期和数字操作)。

    了解如何对查询进行参数化。使用 VFP OleDb,参数是用“?”完成的。字符作为占位符,因此需要以与查询中出现的完全相同的顺序添加参数。这 ”?”可以显示为字段值、连接条件、where 条件等。

    以下是一些让您开始的内容,希望您可以开始使用有效的连接、查询,然后使用参数插入/更新/删除。

    1. Sample showing a connection string and simple query from a table

    2. Shows a parameterized sql-insert但在这种情况下从另一个数据源获取数据,例如 sql-server 并从中创建 VFP/dbf 样式表。它循环遍历记录并为每个参数提取值并插入。

    3. and another showing parameterized SQL-update

    祝你好运,还有很多其他人回答了 VFP 和 OleDb Access,这些只是我专门参与的一些,并展示了一些你可能会错过的功能实现。

    【讨论】:

      【解决方案2】:

      这是一个不错的方法,我没有测试过,但我很快就会...

      http://www.c-sharpcorner.com/uploadfile/rfederico/xbaseenginerfv12022005011623am/xbaseenginerfv.aspx

      【讨论】:

        【解决方案3】:

        我意识到这是一个旧线程,但万一有人通过谷歌到达这里(就像我几天前一样).. 正如我写的 here,优雅的解决方案是使用 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);
        }
        

        【讨论】:

        • 我尝试运行您的代码,但它给出了 Could not load type 'LinqToVfp.VfpQueryProvider' from assembly 'LinqToVFP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 这个错误。任何想法如何解决这个问题?
        【解决方案4】:

        类似...?

         ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=e:\My Documents\dBase;Extended Properties=dBase III"
        Dim dBaseConnection As New System.Data.OleDb.OleDbConnection(ConnectionString )
        dBaseConnection.Open()
        

        发件人:http://bytes.com/forum/thread112085.html

        【讨论】:

        • 您也可以在控制面板中为连接创建一个 ODBC DSN,然后在您的代码中连接到它。
        【解决方案5】:

        FoxPro 2.0 文件与 dBase III 文件完全相同,但对于任何类型为“memo”的字段都有一个额外的位(不确定确切的名称,已经有一段时间了)。这意味着如果您只使用FoxPro 2.x method 来访问文件,它应该可以工作。

        【讨论】:

          猜你喜欢
          • 2012-03-16
          • 2020-11-05
          • 1970-01-01
          • 2015-07-26
          • 1970-01-01
          • 2013-03-17
          • 1970-01-01
          • 2023-03-22
          • 2010-12-21
          相关资源
          最近更新 更多