您可以使用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的基地,我必须清除每行中包含它的一些字符。如果我一行一行地做,它会花费太多,因为数据库没有索引。我必须做一些丑陋的事情,比如将所有内容全部移到内存中,删除所有记录并用更改的记录进行替换。我尝试更新替换命令,但似乎微软JET不支持它。也许有些其他供应商呢?现在我成功更新从Access中取代,但我不确定访问使用什么? – watbywbarif 2010-07-08 21:54:41