Wer lange mit Access gearbeitet hat, schreibt Aktionsabfragen entweder mit der Entwurfsansicht für Abfragen oder erstellt diese per SQL-Quellcode. Vielleicht kombinieren Sie auch beide Varianten und passen per Entwurf erstellte Abfragen in der SQL-Ansicht an. Unter VBA verwendet man außerdem oft DAO, um Datensatzgruppen zu öffnen und Daten anzulegen, zu bearbeiten oder zu löschen. In einem Entity Data Model können Sie auch SQL-Abfragen absetzen, sowohl für Auswahl- als auch für Aktionsabfragen. Allerdings gibt es auch LINQ – die Abfragesprache für das Entity Framework. Dieser Artikel zeigt, wie Sie gängige SQL-Aktionsabfragen oder DAO-Aktionen in LINQ übersetzen.
Beispieldateien
Im Download zu diesem Artikel finden Sie einen Ordner mit den Laufzeitdateien der als Beispiel verwendeten Rechnungsverwaltung. Außerdem finden Sie in der Datei VonSQLZuLINQ.linq alle in diesem Artikel vorgestellten Beispiele.
Was ist LINQ
LINQ heißt Language Integrated Query und ist die Abfragesprache für Entity Data Models. Im Gegensatz zu VBA, wo Sie die Abfragen immer in SQL formulieren und als Parameter von Methoden wie OpenRecordset (bei Auswahlabfragen) oder Execute (bei Aktionsabfragen) angegeben haben, bietet LINQ die direkte Integration in die Sprache Visual Basic (und auch C#).
Im Artikel EF: Daten abfragen mit VB und LINQ (www.datenbankentwickler.net/166) haben wir bereits gezeigt, wie Sie Auswahlabfragen mit LINQ und VB realisieren. Nun schauen wir uns an, wie wir Aktionsabfragen unter LINQ abbilden können.
IntelliSense mit LINQ nutzen
LINQ bietet gegenüber SQL-Abfragen den Vorteil, IntelliSense nutzen zu können. Am einfachsten testen können wir LINQ-Ausdrücke nach wie vor mit dem Tool LINQPad. Wir arbeiten hier mit der Version 5. Um auf die Daten einer SQL Server-Datenbank zugreifen zu können, richten wir mit folgenden Schritten eine Verbindung ein.
Die einzige Voraussetzung ist, dass es eine .exe für das Projekt gibt und dass Sie wissen, wo die Konfigurationsdatei gespeichert ist – was nach dem Debuggen eines Desktop-Projekts mit Visual Studio aber beides vorhanden ist:
- Starten Sie LINQPad 5.
- Klicken Sie im linken Bereich auf Add connection.
- Wechseln Sie im Dialog Choose Datacontext aus Bild 1 zum unteren Bereich und wählen Sie dort den Eintrag Entity Framework (DbContext V4/V5/V6) aus und klicken Sie auf Next.
- Wählen Sie im Dialog Entity Framework dbContext Connection die Dateien für die Eigenschaften Path to Custom Assembly und Path to application config file aus. Hier wählen Sie die .exe-Datei aus, beispielsweise aus dem Ordner Rechnungsverwaltung aus dem Download zu diesem Artikel. Nach der Auswahl der ersten Datei werden Sie in einem weiteren Dialog aufgefordert, die Datenbank-Context-Klasse auszuwählen.
- Anschließend sieht der Dialog Entity Framework DbContext Connection wie in Bild 2 aus. Hier können Sie mit der Schaltfläche Test noch prüfen, ob die Verbindung hergestellt werden kann. Mit dem Aktivieren der Option Remember this connection stellen Sie sicher, dass die Verbindung auch beim nächsten Start von LINQPad noch vorhanden ist.
Bild 1: Einrichten einer Datenquelle mit LINQ
Bild 2: Einrichten der Verbindungsinformationen
Der linke Bereich zeigt nun die Entitäten und Felder der Verbindung an (siehe Bild 3). Mit einem Klick der rechten Maustaste auf eine der Entitäten öffnen Sie ein Kontextmenü, das bereits einige mögliche Befehle für diese Entität anzeigt. Klicken Sie einen dieser Einträge an, wird die passende LINQ-Abfrage im Query-Fenster eingefügt.
Bild 3: Die Entitäten der neuen Verbindung
Standardmäßig zeigt dies nun eine C#-Abfrage an. Wenn Sie möchten, dass automatisch VB-Abfragen erstellt werden, öffnen Sie mit dem Menüeintrag Edit|Preferences den Optionen-Dialog und stellen Sie auf der Seite Query die Option Default Query Language auf VBA Expression oder VB Statement(s) ein.
Damit sind Sie nun auch bereit, eigene LINQ-Abfragen auf Basis der Entitäten des Entity Data Models abzusetzen. Diese geben Sie einfach auf einer Seite mit dem Wert VB Expression im Auswahlfeld Language ein. Sie können übrigens in LINQPad den Verweis auf die Context-Klasse des Entity Data Models weglassen.
Ein Zugriff auf die Entitätslisten kann auch ohne Angabe dieser Klasse erfolgen. Allerdings ist das in Visual Studio nicht möglich, sodass wir in den folgenden Beispielen jeweils auf das Objekt dbContext zugreifen. Die Deklaration und Initialisierung wollen wir jedoch nur einmal anführen:
Dim dbContext As RechnungsverwaltungContext dbContext = New RechnungsverwaltungContext
Einen Datensatz hinzufügen
Um einen Datensatz hinzuzufügen, benötigen wir noch nicht einmal einen LINQ-Ausdruck. Wir erstellen einfach ein neues Objekt des gewünschten Typs, hier Kunde, und weisen diesem die Eigenschaftswerte zu. Dann fügen wir das neue Kunde-Objekt mit der Add-Methode zur Auflistung Kunden hinzu und übernehmen die Änderungen durch einen Aufruf der SaveChanges-Methode in die Datenbank. Schließlich geben wir als Nachweis des erfolgreichen Anlegens noch den Wert des Primärschlüsselfeldes des neuen Datensatzes aus:
'###Beispiel 1 'Einen Kunden hinzufügen Dim dbContext As RechnungsverwaltungContext dbContext = New RechnungsverwaltungContext Dim NeuerKunde As Kunde NeuerKunde = New Kunde With NeuerKunde .AnredeID = 1 .Vorname = "André" .Nachname = "Minhorst" End With dbContext.Kunden.Add(NeuerKunde) dbContext.SaveChanges Debug.Print(NeuerKunde.ID)
Platzsparende Schreibweise für das Anlegen eines neuen Elements
Wir können ein paar Zeilen Code sparen, wenn wir das Anlegen wie folgt programmieren:
'###Beispiel 2 'Kunde hinzufügen, Kurzfassung Dim NeuerKunde As Kunde NeuerKunde = New Kunde With {.AnredeID = 1, .Vorname = "André", .Nachname = "Minhorst"} dbContext.Kunden.Add(NeuerKunde) dbContext.SaveChanges Debug.Print(NeuerKunde.ID)
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: