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