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

8
我在使用C#/.NET时搜索了很多关于如何使用OLEDB或ODBC读写dBase III(dbf)文件的技术。我尝试了几乎所有发布的技术,但均未成功。请问有人能指点我正确的方向吗?
谢谢您的时间。
5个回答

8
我知道这是一个旧的帖子,但如果有人通过谷歌来到这里(就像我几天前一样)...正如我在这里所写的那样,优雅的解决方案是使用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
我尝试运行你的代码,但是它报错 Could not load type 'LinqToVfp.VfpQueryProvider' from assembly 'LinqToVFP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 你有什么解决方法吗? - th1rdey3

8

类似于...的东西吗?

 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()

From: http://bytes.com/forum/thread112085.html


您还可以在控制面板中为连接创建ODBC DSN,然后在代码中连接到它。 - runako

3
FoxPro 2.0 文件与 dBase III 文件完全相同,只是对于类型为“memo”的字段多了一个位。这意味着,如果您只使用 FoxPro 2.x method 来访问文件,它应该可以正常工作。

0

我已经提供了许多关于处理数据库文件的答案(更具体地说是VFP,但Microsoft VFP OleDb提供程序将识别旧的dbase文件)。您可以通过以下方式搜索以查找更多链接:

user:74195[vfp][oledb]

首先,我建议您下载Microsoft VFP OleDb Provider

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

了解如何参数化您的查询。使用VFP OleDb,参数是用“?”字符作为占位符完成的,因此参数需要按照它们在查询中出现的确切顺序添加。“?”可以出现为字段值、连接条件、where条件等。

以下是一些示例,希望能帮助您开始建立有效的连接、查询和使用参数进行插入/更新/删除操作。

  1. 显示了一个连接字符串和从表中进行简单查询的示例

  2. 展示了一个参数化的SQL-insert示例,但在这种情况下,它从另一个数据源(如SQL Server)获取数据,并创建一个VFP/dbf样式的表。它会循环遍历记录并提取每个参数的值并插入。

  3. 还有另一个展示参数化SQL-update的示例

祝您好运!在VFP和OleDb Access上还有许多其他人可以回答您的问题,这些示例只是我特别参与并展示了功能实现,可能有一些您可能错过的东西。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接