.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.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 2 Min.
Von
  • 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.

()