Datenbanken - Software and Systems Engineering

Werbung
Technische Universität München
Datenbanken
Proseminar Objektorientiertes Programmieren mit .NET und C#
Simon Bastian
Institut für Informatik
Software & Systems Engineering
Technische Universität München
Übersicht
§  ADO.Net
–  Objektmodell
–  Connection, Command
–  DataReader
–  DataSet
–  DataAdapter
–  Transaction
§  Object/Relational – Mapping
–  ADO.Net Entity Framework
–  NHibernate, LINQ
§  Zusammenfasssung
03.12.10
Simon Bastian: Datenbanken
2
Technische Universität München
ADO.Net
Programmierschnitstelle für die Datenbankprogrammierung in .Net
Merkmale:
§  Stabilität (.Net)
§  Unabhängigkeit von Datenbankherstellern
§  Platformunabhängigkeit und Ingegration verteilter Komponenten (XML)
§  Skalierbarkeit und Performance (DataSets)
Klassen von ADO.Net im Namespace System.Data
Datenprovider in weiteren Namespaces, z.B. System.Data.SqlClient oder
System.Data.OleDB
03.12.10
Simon Bastian: Datenbanken
3
Technische Universität München
Objektmodell
03.12.10
Simon Bastian: Datenbanken
4
Technische Universität München
Connection Objekt
Das Connection Objekt repräsentiert eine Verbindung zur Datenquelle.
SqlConnection connection = new SqlConnection(String) Das Objekt stellt die Methoden .Open() und .Close() bereit, um die Verbindung
herzustellen bzw. zu schließen.
Die Verbindungszeichenfolge sieht z.B. wie folgt aus:
connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;" + "Integrated Security=SSPI"; Dies würde eine Verbindung mit der Datenbank Northwind auf der lokalen
Server-Instanz SQLEXPRESS aufbauen. Als Anmeldung dient die
Windowssession.
03.12.10
Simon Bastian: Datenbanken
5
Technische Universität München
Builder für Verbindungszeichenfolgen
Da es nicht immer möglich ist Verbindungszeichenfolgen zur Entwurfs- oder
Laufzeit zu erstellen bietet ADO.Net einen Builder für diese an.
Die vorige Verbindungszeichenfolge könnte auch so erstellt werden:
SqlConnectionStringBuilder conBuild = new SqlConnectionStringBuilder(); conBuild.DataSource = @".\SQLEXPRESS"; conBuild.InitialCatalog = "Northwind"; conBuild.IntegratedSecurity = true; Weitere wichtige Eigenschaften des Builders sind z.B. „UserID“ und
„Password“.
Durch Aufruf von ToString() oder ConnectionString() wird eine gültige
Verbindungszeichenfolge zurückgegeben die dem Connectionobjekt übergeben
werden kann.
03.12.10
Simon Bastian: Datenbanken
6
Technische Universität München
Command Objekt
Die Klasse SqlCommand dient zum Ausführen von Abfragen im ADO.Net
Objektmodell.
// Methode des Connection-­‐Objekts SqlCommand command = connection.CreateCommand(); // parameterloser Konstruktor SqlCommand command = new SqlCommand(); command.Connection = connection; In Beiden Fällen muss der eigentliche Befehl noch festgelegt werden:
command.CommandText = queryString; Alternativ kann auch ein parametrisierter Konstruktor verwendet werden:
SqlCommand command = new SqlCommand(queryString, connection); 03.12.10
Simon Bastian: Datenbanken
7
Technische Universität München
Methoden des Command Objekts
ExecuteReader
Ruft Ergebnisse in einem SqlDataReader ab.
ExecuteNonQuery
Erwartet keine Rückgabe (Insert, Update, Delete,
Stored Procedures).
ExecuteScalar
Führt Abfrage aus, ruft erste Spalte der ersten Zeile ab.
Prepare
Bereitet eine Version der Abfrage vor.
Cancel
Bricht die Ausführung der Abfrage ab.
Durch Einfügen eines Parameter Objekts werden parametrisierte Abfragen
unterstützt.
BeginExecute...
Startet asynchrone Abfrage.
EndExecute...
03.12.10
Beendet Ausführung der asynchronen Abfrage.
Simon Bastian: Datenbanken
8
Technische Universität München
DataReader
§  Effizientes und kompaktes Objekt das einen sequentiellen Lesezugriff auf
die Daten ermöglicht.
§  Die Klasse DataReader ähnelt anderen Reader Klassen in .Net
(StreamReader, TextReader).
§  Durch Aufruf der Methode ExecuteReader auf einem Command Objekt wird
ein DataReader zurückgegeben.
§  Wenn der Reader nicht mehr benötigt wird sollte die Close Methode
aufgerufen werden.
03.12.10
Simon Bastian: Datenbanken
9
Technische Universität München
DataSet
§  Eigentlich ist das DataSet Objekt eine Datenmenge.
§  Die Daten im DataSet sind nicht mit der Datenbank verbunden.
§  Im Gegensatz zum DataReader kann auf die Daten beliebig zugegriffen
werden. Man kann sortieren, suchen und filtern.
§  Änderungen lassen sich zwischenspeichern und auch überprüfen, bzw. mit
dem ursprünglichem Stand der Datenbank verlgleichen.
§  In ADO.Net sind DataSet Objekte und XML Dokumente fast gleich. Das
bedeutet man kann leicht von der einen Datenstruktur in die andere
übergehen.
03.12.10
Simon Bastian: Datenbanken
10
Technische Universität München
DataSet
§  Methoden der Klasse DataSet
Clear
Entfernt alle DataRow Objekte
Load
Lädt Daten von einem DataReader
Merge
Führt Daten mehrer DataSets zusammen
§ 
Die einzelnen Tabellen
werden
durch
das DataTable
Objekt repräsentiert.
GetXml
Gibt den
Inhalt
als XML
aus
§  Weitere Klassen:
DataColumn, DataRow,
UniqueConstraint,
WriteXmlSchema
Schreibt
das Schema als ForeignKeyConstraint
XML in eine Datei
03.12.10
Simon Bastian: Datenbanken
11
Technische Universität München
DataAdapter
Die Klasse DataAdapter dient als Brücke zwischen den Daten in der DB und
einem DataSet, das offline verfügbar ist. Der DataAdapter kann in einem
DataSet zwischengespeicherte Änderungen an die Datenbank übermitteln.
DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(queryString, connectionString); da.Fill(ds); Fill führt die Abfrage aus und speichert die Ergebnisse in einem DataSet.
Durch die Methode Update können Änderungen an die Datenbank übermittelt
werden.
da.Update(ds); Im Gegensatz zum Command Objekt wird das Öffnen und Schließen der
Verbindung durch den DataAdapter verwaltet.
03.12.10
Simon Bastian: Datenbanken
12
Technische Universität München
Transaction
Bietet die Möglichkeit alle Änderungen an der Datenbank auf einmal zu
übermitteln.
Entweder sind alle Änderungen erfolgreich oder alle werden verworfen.
SqlTransaction ta = connection.BeginTransaction(); SqlCommand command = connection.CreateCommand(); command.Transaction = ta; try { command.CommandText = "INSERT INTO Customers.NewCol1 Values('1')"; command.ExecuteNonQuery(); command.CommandText = "INSERT INTO Customers.NewCol1 Values('2')"; command.ExecuteNonQuery(); ta.Commit(); } catch (Exception e) { ta.Rollback(); } 03.12.10
Simon Bastian: Datenbanken
13
Technische Universität München
Beispiel
Das Query gegen die Beispieldatenbank Northwind ermittelt die Kunden, deren
Bestellungen von Ms. Dodsworth (EmployeeID 9) bearbeitet wurden.
string connectionString = conBuild.ToString(); string queryString = "SELECT DISTINCT c.CustomerID, c.CompanyName" +" FROM dbo.Customers c" +" JOIN dbo.Orders o ON c.CustomerID = o.CustomerID" +" JOIN dbo.Employees e ON o.EmployeeID = e.EmployeeID" +" WHERE e.EmployeeID = 9" +" ORDER BY c.CustomerID"; 03.12.10
Simon Bastian: Datenbanken
14
Technische Universität München
Beispiel
using (SqlConnection connection = new SqlConnection(connectionString)) {
SqlCommand command = connection.CreateCommand(); command.CommandText = queryString; try {
connection.Open(); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) {
Console.WriteLine("\t{0}\t{1}", reader[0], reader[1]); } reader.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } } 03.12.10
Simon Bastian: Datenbanken
15
Technische Universität München
Object / Relational - Mapping
§  Bei steigender Komplexität der Logik wird es immer schwieriger eine
Übersicht über die Struktur zu bewahren. Bisher im Bezug auf ADO.Net war
es nötig das Mapping zwischen Logik und Daten selbst vorzunehmen.
§  Ein Mapper stellt eine Vermittlung zwischen Daten und Objekten da. Ein
relationales Modell wird in ein Objektmodell überführt.
§  In einem einfachen Fall werden Tabellen auf Klassen abgebildet. Jeder
Datensatz enspricht der Instanz eines Objekts.
§  Seit .Net 3.5 SP1 ist das Entity Framework, ein O/R Mapping Framework,
Bestandteil von ADO.Net.
03.12.10
Simon Bastian: Datenbanken
16
Technische Universität München
ADO.Net Entity Framework
§  O/R Mapper von Microsoft, Teil von .Net seit Version 3.5 SP1
§  Im Vergleich zu LINQ bietet EF eine große Auswahl an Datenprovidern
(Oracle, DB2, PostgreSQL, MySQL)
§  LINQ2SQL 1:1 Relationen – EF N:M Relationen
§  Durch Integration in Visual Studio und einen vorhanden Assistenten wird
eine relativ leichte Bedienung ermöglicht.
03.12.10
Simon Bastian: Datenbanken
17
Technische Universität München
ADO.Net Entity Framework Beispiel
using (NorthwindEntities nw = new NorthwindEntities())
try {
{
string queryString = "SELECT VALUE c FROM NorthwindEntities.Customers“ +“ AS c WHERE c.EmployeeID = 9"; ObjectQuery<Customers> custQuery = new ObjectQuery<Customers>(queryString, nw, MergeOption.NoTracking); foreach (Customers result in custQuery) {
Console.WriteLine("\t{0}\t{1}", result.CustomerID, result.CompanyName); } } catch (Exception e) { Console.WriteLine(e.Message); } } 03.12.10
Simon Bastian: Datenbanken
18
Technische Universität München
NHibernate
§  .Net Portierung des Java O/R Mapping Frameworks Hibernate
§  Open Source
§  Aufbauend auf ADO.Net
LINQ
§  Komponente des .Net Frameworks die zur Abfrage von Datenbanken und
XML Dokumenten dient
§  O/R Mapper
Vortrag zu LINQ
03.12.10
Simon Bastian: Datenbanken
19
Technische Universität München
Zusammenfassung
§  ADO.Net lässt sich sehr einfach konfigurieren und einsetzen
§  Ähnlichkeit zu Java ermöglicht schnellen Einstieg
§  O/R Mapping für komplexere Anwendungsszenarien durch EF integriert
Beispielsweise würde man ein einfaches Reporting wahrscheinlich ohne O/R
Mapping realisieren. Für eine komplexe Konsolidierungslogik bietet sich ein
Framework an.
Für weitere Informationen ist das MSDN zu empfehlen.
03.12.10
Simon Bastian: Datenbanken
20
Herunterladen