我已经搜索了有关如何通过 C#/.NET 使用 OLEDB 或 ODBC 读取/写入 dBase III (dbf) 文件的各种技术。我已经尝试了几乎所有发布的技术,但没有成功。有人可以指出我正确的方向吗?
谢谢你的时间。
就像是 ... ?
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()
我意识到这是一个旧线程,但万一有人通过谷歌来到这里(就像我几天前一样)。正如我在这里写的那样,优雅的解决方案是使用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);
}
FoxPro 2.0 文件与 dBase III 文件完全相同,但对于任何类型为“memo”的字段都有一个额外的位(不确定确切的名称,已经有一段时间了)。这意味着如果您只使用FoxPro 2.x 方法来访问文件,它应该可以工作。
这是一个不错的方法,我没有测试过,但我很快就会......
http://www.c-sharpcorner.com/uploadfile/rfederico/xbaseenginerfv12022005011623am/xbaseenginerfv.aspx
我提供了许多关于使用数据库文件的答案(更具体地说是 VFP,但 Microsoft VFP OleDb 提供程序将识别较旧的 dbase 文件。您可以通过以下方式进行搜索以找到更多这些链接:
用户:74195[vfp][oledb]
首先,我将从下载Microsoft VFP OleDb Provider开始。
接下来,如果您已经有一些 dbf 文件要尝试连接以进行测试,则需要建立连接。连接必须指向文件所在的 PATH,而不是特定的 .dbf 文件。因此,如果您有一个包含 20 个表的文件夹,一旦您连接到 PATH,您可以通过标准 VFP-SQL 语法从任何/所有表中查询(与许多 sql 的整体结构相同,但根据某些功能而有所不同像字符串、日期和数字操作)。
了解参数化您的查询。使用 VFP OleDb,参数是用“?”完成的。字符作为占位符,因此需要以与查询中出现的完全相同的顺序添加参数。这 ”?” 可以显示为字段值、连接条件、where 条件等。
以下是一些让您开始的方法,希望让您开始使用有效的连接、查询,然后使用参数插入/更新/删除。
显示一个参数化的 sql-insert,但在这种情况下从另一个数据源获取数据,例如 sql-server 并从中创建一个 VFP/dbf 样式表。它遍历记录并为每个参数提取值并插入。
祝你好运,还有很多其他人回答了 VFP 和 OleDb Access,这些只是我专门参与的一些,并展示了一些你可能会错过的功能实现。