我可以使用什么数据提供程序从 C# 更新 .dbf 文件?
我尝试了一些不同的 .dbf 提供程序来创建数据源,但收到如下消息: “错误消息:错误 HYC00 Microsoft ODBC dBase 驱动程序可选功能未实现。”
或者当我生成一个数据集和一个具有更新功能的数据适配器时,我得到:“当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand。”
如果有人知道从 C# 处理 .dbf 的方法并进行了大量更新,请提供帮助。当我尝试逐行更新时,速度太慢,因为提供程序会在搜索大 .dbf 文件时浪费太多时间。也许有一种方法可以自动构建索引并且数据源知道使用它?
另一种方法是将所有内容加载到数据集之类的内容中,并在所有更改完成后进行更新,但更新部分目前不起作用。
请帮忙!
您可以使用 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);
}
从您关于〜1GB数据库的评论来看,我也使用VFP数据库(.dbf)文件格式,并且SQL更新通过OleDbCommand创建/执行没有问题,并且可以使用VFP OleDbProvider运行的任何本机命令。
为了尝试删除某些字符,我通常使用函数 CHRTRAN() (也就是说,如果您确实使用 Visual Foxpro Ole DB Provider),您可以在其中逐字删除许多字符(例如无效字符),例如...
Update YourTable
set SomeField = chrtran( SomeField, "!@#$%^*(", "" )
将遍历所有记录并从字段(第一个参数)中删除任何单个字符(第二个参数)的实例,并将其更改为在第三个参数中找到的相应字符...在这种情况下,没有值,只是空字符串,因此字符将被删除。本身速度相当快,您不必不断扫描所有正在下载、测试然后推回的记录。
同样,不确定您正在使用哪种本机 .DBF 文件系统,但 VFP 通过此类操作速度非常快。
如果您坚持使用非常基本的 SQL 操作,普通的
OleDbConnection
可以很好地处理 DBF。
在我工作的地方,我们构建和维护仅使用 OleDb 类与 DBF 交互的应用程序。然而,我们不使用适配器或数据源——一切都是通过 OleDbCommands、OleDbDataReaders 等“直接”完成的。
也许 DataAdapter 所依赖的功能在与基本或遗留数据源(例如 xBase)交互时可能不存在。您是否尝试过使用
UPDATE
OleDbCommand?
通常,FoxPro 驱动程序使用 .DBF 文件。文件格式非常相似,非常适合阅读。写作有点棘手。不幸的是,由于 DBASE 是一项非常古老的技术,.NET 并不能很好地使用它,因此您几乎只能使用缓慢的选项。相信我,我能感受到您的痛苦,因为我必须定期使用这些来维护我们支持的 POS 系统。
http://www.aspcode.net/Reading-DBF-files-in-C.aspx
如何使用 C#/.NET ODBC 或 OLE 读取/写入 dBase III 文件?
最后,我最喜欢的连接字符串来源: