.net 从C处理.dbf的最佳方法#
我可以使用哪个数据提供程序从C#更新.dbf文件 我尝试了几个不同的.dbf提供程序来创建数据源,但得到的消息如下: “错误消息:错误HYC00 Microsoft ODBC数据库驱动程序可选功能未实现。” 或者,当我生成了一个数据集和一个带有更新函数的dataadapter时,我得到了:“当传递带有修改行的DataRow集合时,更新需要一个有效的UpdateCommand。” 如果有人知道如何使用C#中的.dbf进行大量更新,请提供帮助。当我尝试逐个更新行时,速度太慢,因为提供程序在搜索大的.dbf文件时会浪费太多时间。也许有一种方法可以自动构建索引,并且数据源知道如何使用它 另一种方法是在所有更改完成后将所有内容加载到dataset和update中,但更新部分暂时无法工作.net 从C处理.dbf的最佳方法#,.net,database,ado.net,dbf,.net,Database,Ado.net,Dbf,我可以使用哪个数据提供程序从C#更新.dbf文件 我尝试了几个不同的.dbf提供程序来创建数据源,但得到的消息如下: “错误消息:错误HYC00 Microsoft ODBC数据库驱动程序可选功能未实现。” 或者,当我生成了一个数据集和一个带有更新函数的dataadapter时,我得到了:“当传递带有修改行的DataRow集合时,更新需要一个有效的UpdateCommand。” 如果有人知道如何使用C#中的.dbf进行大量更新,请提供帮助。当我尝试逐个更新行时,速度太慢,因为提供程序在搜索大的.
救命啊 如果您坚持使用非常基本的SQL操作,那么普通的OleDbConnection可以很好地处理DBF 在我工作的地方,我们构建并维护使用专用OleDb类与DBF交互的应用程序。然而,我们不使用适配器或数据源——一切都是通过OleDbCommands、OleDbDataReaders等“直接”完成的
也许DataAdapter依赖于与基本或旧数据源(如xBase)交互时可能不存在的功能。您是否尝试过使用
更新
OleDbCommand?通常,FoxPro驱动程序使用.DBF文件。该文件格式非常相似,适合阅读。写作有点棘手。不幸的是,由于DBASE是一种非常古老的技术,.NET不能很好地使用它,因此您几乎只能选择缓慢的选项。相信我,我感觉到你的痛苦,因为我必须为我们支持的POS系统定期使用这些
最后,我最喜欢的连接字符串源:
从您关于1GB数据库的信息中,我也可以使用VFP数据库(.dbf)文件格式,SQL更新通过OleDbCommand创建/执行工作没有问题,并且可以使用VFP OleDbProvider运行的任何本机命令 为了尝试删除一些字符,我通常使用函数CHRTRAN()(也就是说,如果您使用Visual Foxpro Ole DB Provider),您可以从中删除许多字符(例如无效字符),例如
Update YourTable
set SomeField = chrtran( SomeField, "!@#$%^*(", "" )
将遍历所有记录并从字段(第一个参数)中删除任何字符,单个字符的任何实例(2st参数),并将其更改为在第三个参数中找到的相应字符。。。在本例中,没有值,只有一个空字符串,因此字符将被删除。它本身相当快,而且您不必一直扫描所有正在下载、测试、然后被推后的记录
同样,不能确定您使用的是哪个本机.DBF文件系统,但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; }
}
}
您可以这样定义上下文:
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; }
}
}
最后,您可以执行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的基数,我必须从包含它的每一行中清除一些字符。如果我一行一行地做,会花费太多的时间,因为db没有索引。我必须做一些丑陋的事情,比如把所有的记录都放到内存中,删除所有的记录,然后用更改过的记录替换。我尝试使用replace命令进行更新,但Microsoft JET似乎不支持该命令。也许其他供应商会这样做?现在我成功地用Access中的replace进行了更新,但我不确定Access使用的是什么?我通过以下您推荐的页面上的链接发现了这一点:它看起来很有希望,改天我会尝试一下。有趣的方法,我将在下次需要时研究它。法拉蒂苏杰德。Živio!)