2007-08-05

Datensätze aus der Datenbank ermitteln

In den folgenden Zeilen gehe ich davon aus, dass Sie bereits mit Visual Studio vertraut sind und bereits Windows Forms Projekte erstellt haben. Daher werde ich die einzelnen Schritte nicht bis ins Detail beschreiben.

Mit dem folgenden Beispiel werden die Datensätze aus der Datenbank ermittelt und die Daten werden mit einer Windows Forms Applikation dargestellt. Als Datenquelle wird ein SQL Server 2005 Instanz mit der AdventureWorks Datenbank verwendet.


Sie können als Datenbankserver auch die SQL Server 2005 Express Edition verwenden. Bei der Express Edition stehen Ihnen jedoch verschiedene Tools wie SQL Server Management Studio für die Datenbankverwaltung und SQL Server Profiler für die Überwachungszwecke nicht zur Verfügung. Die Einschränkungen vom SQL Server Express sollten auf dieses Beispiel keinen Einfluss haben.


Die AdventureWorks Datenbank wird mit dem SQL Server 2005 als Beispiel Datenbank geliefert. Dieser Datenbank können Sie bei der Installation von Ihren SQL Server 2005 Instanz mitinstallieren. Ab msdn.microsoft.com können Sie diese Datenbank auch nachträglich herunterladen und installieren.
Im folgenden Beispiel wird gezeigt, wie Sie Datensätze mit Hilfe der LINQ to SQL aus der Datenbank ermitteln können. An dieser Stelle werden Sie eine einfache Query Expression schreiben, welche Ihnen den Inhalt der ProductCategory Tabelle aus der Datenbank ermittelt. Im zweiten Schritt wird ein bestimmter Datensatz mit einer Lambda Expression aus der Datenbank ermittelt und an einem ProductCategory Objekt zugewiesen.


Für die Darstellung der Daten werden Sie ein Windows Forms Applikation erstellen. Das Projekt beinhaltet für das aktuelles Beispiel zwei Windows Forms. Mit FrmProductCategory Form werden die Daten in einem DataGridView Control aufgelistet und beim selektieren von einer Zeile im DataGridView Control werden die Daten der selektierten Datensatz in zwei TextBox Controls angezeigt. Das From1 wird beim Erstellen vom Windows Forms Applikation Projekt mit erstellt. Über das Form1 wird später FrmProductCategory Form gestartet.


1. Erstellen Sie mit Visual Studio über das Menü File - New ein neues Windows Forms Application Projekt.


2. Definieren Sie als Projektname AdventuresWorksUI und als Solution Name AdventureWorks.


Als nächstes definieren Sie die Entity Klasse ProductCategory. Für das Beispiel benutzen Sie die ProductCategory Tabelle als Datenquelle aus der AdventureWorks Datenbank. Die Entity Klasse werden Sie mit Hilfe der Drag & Drop Unterstützung von Visual Studio erstellen. Für diese Unterstützung benötigen Sie ein LINQ to SQL Element, welches Sie an das Projekt als Zusätzliches Element hinzufügen werden.. Das LINQ to SQL Element wird vom Visual Studio als Projektdatei mit der Endung dbml und im XML Format gespeichert.


3. Fügen Sie über das Menü Project – Add New Item oder über das Solution Explorer Fenster mit rechten Maustaste und Add - New Item ein neues LINQ to SQL Element an das Visual Studio Projekt hinzu.


4. Wählen Sie im Add New Item Fenster den LINQ to SQL Classes Element und definieren Sie AdventureWorks.dbml als Dateiname.


Anschließend zu Ihrer Auswahl sehen Sie den grafischen Designer für die Entity Klassen. Innerhalb der Designer werden die Entity Klassen und die Verbindungen zwischen der Entity Klassen grafisch dargestellt. Mit Hilfe der Drag & Drop Funktionalität können Sie die gewünschte Datenbanktabelle einfach auf die Designeroberfläche ziehen. Im Hintergrund generiert Visual Studio die nötigen Code für die Entity Klasse. Sie können auch die verschiedenen Eigenschaften der Entity Klasse oder die einzelnen Felder der Entity Klasse über das Properties Fenster bearbeiten.


5. Definieren Sie im Server Explorer Fenster die Verbindung zu Ihrer SQL Server Instanz. Wenn bei Ihren Visual Studio das Server Explorer Fenster nicht ersichtlich ist, können Sie über den Menü View – Server Explorer diesen Fenster anzeigen lassen.


6. Klicken Sie mit der rechten Maustaste auf das Data Connections und wählen Sie den Menü Eintrag Add Connection.


Im Server Explorer können Sie die Verbindungen zu den verschiedenen Datenbanken definieren. Wenn Sie eine Verbindung schon mal definiert haben, können Sie diese Verbindung auch bei anderen Projekten weiterverwenden.


Den Server Explorer Fenster können Sie auch als Datenbank Browser verwenden. Wenn Sie auf einzelne Datenbankobjekte mit der rechten Maustaste klicken, stehen Ihnen vom Objekttyp abhängige Kontextmenü zur Verfügung. Über dieses Menü können Sie die einzelnen Funktionalitäten der Server Explorer verwenden.


Eine neue Tabelle erstellen oder die Definition einer Tabelle ändern ist über das Server Explorer möglich. Sie können mit dem Abfrage Editor Abfragen erstellen und diese über die aktuelle Datenbankverbindung ausführen.


7. Als nächstes geben Sie die Informationen über Ihren SQL Server und Ihrer Datenbank ein. Wenn Sie unter der Datenbanken AdventureWorks Datenbank nicht finden, installieren Sie dieser Datenbank bevor Sie weitermachen.


Nach dem Sie die Verbindung erfolgreich hergestellt haben, werden die Datenbankobjekte im gleichen Fenster aufgelistet. Unter der Tables finden Sie die ProductCategory (Production) Tabelle.


8. Markieren Sie die ProductCategory Tabelle und ziehen Sie mittels Drag & Drop auf die Designeroberfläche.


Die ProductCategory Entity Klasse wird innerhalb der Designer Fenster visuell dargestellt. Sie sehen die einzelnen Felder der ProductCategory Tabelle. Der Primär Schlüssel wird mit einem Schlüssel Symbol gekennzeichnet.


Als nächstes erstellen Sie ein neues Windows Forms Element. In diesem Element werden die Daten der ProductCategory Tabelle dargestellt.


9. Erstellen Sie ein neues Windows Form über das Menü Project – Add Windows Form.


10. Im Add New Item Fenster wählen Sie den Windows Form Element.


Als nächstes definieren Sie das Verhalten der einzelnen Controls auf dem FrmProductCategory. Die Datensätze der ProductCategory Tabelle werden in einem DataGridView Control aufgelistet. Beim selektieren einer Zeile werden die Detailinformationen in zwei Text Controls unterhalb der DataGridView Control angezeigt. Sobald eine andere Zeile im DataGridView Control markiert wird, werden auch die TextBox Controls aktualisiert.


Die Daten für das DataGridView Element werden beim Load Ereignis von FrmProductCategory aus der Datenbank ermittelt und an die DataSource Eigenschaft der DataGridView Control weitergegeben.


Im SelectionChanged Ereignis vom DataGridView Control wird die ProductID der markierten Zeile ermittelt. Mit Hilfe einer Lambda Expresion wird der dazu gehörende Datensatz aus der Datenbank neu gelesen und das Resultat wird an einem Objekt vom Typ ProductCategory zugewiesen. Der Typ ProductCategory ist die ProductCategory Entity Klasse und das Objekt ist ein Instanz von diesem Typ. An die TextBox Controls werden die Eigenschaften dieses Objektes für die Darstellung der Daten weitregegeben. In diesem Schritt sehen Sie, wie Sie mit Hilfe einer Lambda Expression einen Datensatz aus der Datenbank ermitteln können.


11. Definieren Sie auf dem FrmProductCategory folgende Controls und setzen die Eigenschaften wie sie in der Tabelle aufgeführt sind.


DataGridView
Name: dgvProductCategory
AllowUserToAddRows: False
AllowUserToDeleteRows: False
Anchor: Top, Left, Right
ColumnHeadersHeightSizeMode: Autosize
ReadOnly: True
SelectionMode: FullRowSelect


Label
Name: lblID
Text: ID:


Label
Name: lblName
Text: Name:


TextBox
Name: txtID


TextBox
Name: txtName

12. Wechseln Sie in den Code Ansicht von FrmProductCategory und definieren Sie eine private Variable vom Typ AdventureWorksDataContext. Geben Sie _db als Namen für die Variable.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AdventureWorksUI
{
public partial class FrmProductCategory : Form
{
// Definieren DataContext Objekt als private Varible.
AdventureWorksDataContext _db;
public FrmProductCategory()
{
InitializeComponent();
}
}
}


Im Load Ereignis von FrmProductCategory wird eine neue Instanz der AdventureWorksDataContext Klasse erstellt. Das erstellte DataContext Objekt wird später für das Laden der Datensätze aus der Datenbank verwendet.


Die Verbindungsinformationen zum Datenbankserver werdenn aus der app.config Datei gelesen. Sie können beim instanzieren der DataContext Klasse ein neuer ConnectionString an den Constructor der DataContext Klasse übergeben, wenn Sie die Verbindung zu einem anderen Datenbankserver herstellen möchten.


In der Praxis sollen die Verbindungsinformationen in einer Konfigurationsdatei abgelegt werden, anstatt im Code als fix zu programmieren.


13. Instanzierien Sie die AdventureWorksDataContext Klasse im Load Ereignis von FrmProductCategory und machen Sie die Zuweisung an die _db Variable. Sie können über das Properties Fenster den Load Ereignis für das form erstellen. Markieren Sie den Load Eintrag in der Liste und doppelklicken Sie in das rechte Feld.


14. Für die Instanzierung der AdventureWorksDataContext Klasse und Zuweisung an die _db Variablen ergänzen Sie den Load Ereignis wie folgt:
private void FrmProductCategory_Load(object sender, EventArgs e)
{
// Das DataContext Objekt wird erstellt.
_db = new AdventureWorksDataContext();
}


Als nächstes definieren Sie in Button für das Laden der ProductCategory Datensätze aus der Datenbank.


15. Erstellen Sie auf dem FrmProductCategory Form folgendes Control und setzen Sie die Eigenschaften wie in der Tabelle aufgelistet.
Button
Name: btnLoad
Text: Load


16. Erstellen Sie den Click Ereignis für das Load Button. Hinter diesem Ereignis werden die Daten mit Hilfe von _db Objekt und LINQ to SQL Query aus der Datenbank ermittelt.


17. Ergänzen Sie den Code für das Click Ereignis wie folgt:
private void btnLoad_Click(object sender, EventArgs e)
{
// Mit einer Query Expression werden die Datensätze der
// ProductCategory Tabelle aus der Datenbank ermittelt
// und an die DataSource Eigenschaft von DataGridView
// Control übergegeben.
dgvProductCategory.DataSource = from pc in _db.ProductCategories
select pc;
}


18. Erstellen Sie den SelectionChanged Ereignis für das DataGridView Control. Im SelectionChanged Ereignis werden die Daten für die beiden TextBox Controls aus der Datenbank neu gelesen.


19. Ergänzen Sie den SelectionChanged Ereignis mit folgendem Code.
private void dgvProductCategory_SelectionChanged(object sender, EventArgs e)
{
// Wenn keine Zeile im DataGridView Control selektiert
// ist, dann werden die beiden TextBox Controls Inhalte
// gelöscht.
if (dgvProductCategory.SelectedRows.Count != 1)
{
txtID.Text = String.Empty;
txtName.Text = String.Empty;
return;
}
// Die ID der selektierten Datensatz wird in eine
// Variable gespeichert.
int productCategoryID = (int) dgvProductCategory.SelectedRows[0].Cells["ProductCategoryID"].Value;
// Mit Hilfe der Single Methode wird aus der
// ProductCategory Tabelle ein Datensatz mit einer
// bestimmte ID gelesen und das Resultat wird an das
// pc Objekt vom Typ ProductCategory weitergegeben.
ProductCategory pc = _db.ProductCategories.Single(p => p.ProductCategoryID == productCategoryID);
// Die ID und Name Informationen werden aus dem pc Objekt
// ausgelesen und an die beiden TextBox Controls
// für die Darstellung weitergegeben.
txtID.Text = pc.ProductCategoryID.ToString();
txtName.Text = pc.Name;
}


Listing 2.7: Selektierte ID der Datensatz wird in eine Variable gespeichert und mit der Single Methode wird dieser Datensatz aus der Datenbank neu gelesen und das Resultat wird an das ProductCategory Objekt übergegeben.


Im obigen Code haben Sie die Single Methode für das selektieren einer bestimmten Datensatz verwendet und das Resultat haben Sie an das pc Objekt vom Typ ProductCategory zugewiesen. Mit der Single Methode können Sie einen bestimmten Datensatz mit Hilfe der Lambda Expression aus der Datenbank ermitteln. Hier wird die ProductCategory Tabelle über das Feld ProductCategoryID, welches der primäere Schlüssel der Tabelle ist, mit der Variable productCategoryID Eine eindeutige ID mit einem Parameter kann mit dieser Methode verwendet werden.
Beim erstellen vom neuen Windows Forms Application Projekt wurde auch ein Form mit dem Namen Form1 erstellt. Über das Form1 können Sie das FrmProductCategory anzeigen lassen.


20. Öffnen Sie den Form1 und definieren Sie einen Button Control mit folgenden Eigenschaften.
Button
Name: btnProductCategory
Text: Product Category


21. Definieren Sie mit dem Properties Fenster den Click Ereignis für den Product Category Button.


22. Ergänzen Sie den Click Ereignis für das ProductCategory Button wie folgt:
private void btnProductCategory_Click(object sender, EventArgs e)
{
FrmProductCategory frm = new FrmProductCategory();
frm.ShowDialog(this);
}


23. Jetzt können Sie das Projekt mit F5 kompilieren und starten. Nach erfolgreicher Kompilierung wird das Form1 angezeigt. Mit dem Product Category Button können Sie das FrmProductCategory Form anzeigen lassen.

No comments: