.NET-LINQ und Microsofts Access-Datenbanken
Wie man mit Language Integrated Query (LINQ) in C# oder Visual Basic .NET auf Microsofts Access-Datenbanken zugreifen kann.
- Dr. Holger Schwichtenberg
Auf der SQL Server und .NET-Konferenz (SNEK) in NĂĽrnberg wurde ich gefragt, ob man mit dem ADO.NET Entity Framework/LINQ-to-Entities auf Microsofts Access-Datenbanken zugreifen kann. Microsoft liefert einen solchen Treiber nicht. Auch ist mir kein Drittanbieter bekannt, der einen Entity-Framework-Treiber fĂĽr Access liefert.
Es gibt aber im Rahmen des LINQ IQueryable Toolkit einen direkten LINQ-Provider für Access (IQToolkit.Data.Access.dll). Bei diesem Provider, den ich selbst schon eingesetzt habe, kann man mit LINQ (einschließlich der zugehörigen Lambda-Syntax) Daten lesen und über eine API, die der von LINQ-to-SQL und ADO.NET Entity Framework ähnlich ist, auch speichern. Beispiel:
var provider = DbEntityProvider.From(@"c:\data\Northwind.accdb",
"Test.Northwind");
var ns = new NorthwindSession(provider);
cust = ns.Customers.Single(c => c.CustomerID == "XX1");
cust.ContactName = "Contact Modified";
ns.SubmitChanges();
Die Klassen fĂĽr die Access-Tabellen muss man allerdings selbst anlegen. (Oder sich selbst einen Generator schreiben. Ich habe mir dazu ein T4-Template gebaut). Einen Designer fĂĽr Visual Studio gibt es nicht. Es reichen POCO-Klassen wie diese:
namespace Test
{
public class Customer
{
public string CustomerID;
public string ContactName;
public string CompanyName;
public string Phone;
public string City;
public string Country;
public IList<Order> Orders;
}
...
}
Alternativ kann man das Mapping auch durch Annotationen mit .NET-Attributen steuern:
[Table]
[Column(Member = "CustomerId", IsPrimaryKey = true)]
[Column(Member = "ContactName")]
[Column(Member = "CompanyName")]
[Column(Member = "Phone")]
[Column(Member = "City", DbType="NVARCHAR(20)")]
[Column(Member = "Country")]
[Association(Member = "Orders", KeyMembers = "CustomerID",
RelatedEntityID = "Orders", RelatedKeyMembers = "CustomerID")]
public override IEntityTable<Customer> Customers
{
get { return base.Customers; }
}
Andere Benutzer im Internet berichten von folgenden Lösungen zum Thema LINQ und Access, die ich aber nicht ausprobiert habe:
- Man soll LINQ-to-SQL auch für Access verwenden können. Ein Benutzer erwähnt in einem Forum, dass er das geschafft habe (aber auch hier ohne Designer).
- Mehrfach wird auf das Produkt ALINQ verwiesen. Die zugehörige Website http://www.alinq.org/ ist aber zumindest derzeit nicht erreichbar.