Zdaję sobie sprawę, że jest to stary wątek, ale na wypadek, gdyby ktoś dostał się tutaj przez google (tak jak ja miałem kilka dni temu). Jak napisałem here, eleganckim rozwiązaniem jest użycie LINQ to VFP do odczytu i zapisu do plików DBF. Testowałem to z niektórymi plikami dBase III. To idzie tak:
zdefiniować tabelę, aby dopasować definicję DBF takiego:
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; }
}
zdefiniować kontekst tak:
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>(); }
}
}
zdefiniować atrybuty kontekstu tak:
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; }
}
}
Potrzebny jest również ciąg połączenia, można go zdefiniować w app.config w ten sposób (Data\
względna ścieżka jest używana jako źródło plików DBF w tym przypadku):
<connectionStrings>
<add name="VfpData" providerName="System.Data.OleDb"
connectionString="Provider=VFPOLEDB.1;Data Source=Data\;"/>
</connectionStrings>
I wreszcie, można wykonać czytania i pisania do iz DBF plików proste:
// 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);
}
Można także utworzyć numer DSN ODBC dla połączenia w Panelu sterowania, a następnie połączyć się z tym w kodzie. – runako