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