Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

ADO.NET Ralf Westphal Freier Fachautor & Berater MSDN Regional Director

Ähnliche Präsentationen


Präsentation zum Thema: "ADO.NET Ralf Westphal Freier Fachautor & Berater MSDN Regional Director"—  Präsentation transkript:

1 ADO.NET Ralf Westphal Freier Fachautor & Berater MSDN Regional Director

2 Ausgangsfrage Wie wollen Sie in OO-Programmen auf Ihre Daten zugreifen? Per relationalem Datenzugriffs-API Cursor, Join etc. Per Objektmodell Objekte, Collections, Hierarchien

3 Sind Datenbanksysteme nötig? Kann Datenverwaltung nicht über Objektmodelle stattfinden? Intuitive Abbildung der realen Welt Einfache zu Traversieren/Manipulieren 1 Datenmodell für persistente Daten und in- memory Datenverwaltung, statt 2 Probleme Persistenz Abfragen Gleichzeitiger Zugriff Große Datenmengen

4 Lösungen Lösungen für mögl. Probleme mit Objektmodellen für die Datenhaltung Persistenz Serialisierung (.NET Formatter) Abfrage Deklarative Abfragesprache Meta-Objektmodell Gleichzeitiger Zugriff (Objektmodell-)Server Clients cachen Daten Große Datenmengen Server mit beliebiger interner Datendarstellung

5 Fazit Datenbanken sind notwendig Wertvolle Dienstleistungen Transaktionen, gleichzeitiger Zugriff, Verwaltung großer Datenmengen, Replikation usw. Objektmodelle stehen nicht im Gegensatz zu Datenbanken Wir brauchen... ein vernünftiges Meta-Objektmodell ein zum Meta-Objektmodell passenden Datenbankzugriffs-APIs

6 ADO.NET Grundlagen

7 ADO.NET im.NET Framework.NET Plattform.NET Enterprise Servers.NET Devices Web Services Building Blocks

8 ADO.NET Architektur Managed Provider Data- Adapter DataReader Command Connection XmlReader XmlText-ReaderXmlNode-Reader XmlDocument TextReader String Stream Stream … … myDataSet Item Cust Order Web/Windows Form Controls VS.NET Designers VS.NET Class Generator

9 ADO vs ADO.NET ein Überblick der Änderungen COM Marshalling Connection oriented OLE DB Provider Zwei mögliche Programmiermod.: ADO OLE DB nativ Cursor Joins für > 1 Tabelle Datentypen von COM/COM+ abhängig COM+, Datasets Disconnected Access Managed Providers Ein Modell: Managed Provider (connected Layer) DataSet (discon.) (Kein Cursor) Kein Join notwendig XML, keine Datentypen Konvertierung nötig

10 Managed Providers Interaktion mit Datenquellen managen Äquivalent des OLE DB Layers Direkte Darstellung des Consumer Interfaces (nicht mehr mit der Zweiteilung COM/Automation) Aktuelle Implementierungen OleDB Managed Provider (ähnlich ADO) Zugriff auf beliebige OLE DB Provider SQLServer Managed Provider Weitere folgen ODBC SQL XML Datastore DataProvider

11 Einbindung in die Objekthierarchie... System.Data System.Data.OleDb System.Data.SqlClient... System.Data DataSet DataTable DataColumn DataRow DataSetView DataRelation System.Data.OleDb OleDbCommand OleDbDataReader OleDbDataAdapter OleDbParameter OleDbErrors OleDbConnection... System.Data.SqlClient SqlCommand SqlDataReader SqlDataAdapter SqlParameter SqlErrors SqlConnection...

12 ADO.NET Objekt Model Das klassische ADO Gewand … Connection Command, Parameter … mit neuen Objekten: DataReader Forward-only, Read-only Recordset DataSet Disconnected, In-Memory Cache DataAdapter Verbindet das DataSet mit der Datenquelle

13 Connection Objekt Repräsentation einer Verbindung zu einer Datenquelle Mit einer Connection ist es möglich … Die Verbindung zur Datenquelle anzupassen Transaktionen zu handhaben (Begin, Commit, Abort) Ähnlichkeiten zum ADODB.Connection Objekt sind nicht unerwünscht

14 // Angabe des Namespace (System.Data.SQL) Using System.Data.SqlClient; // Instanziieren eines SQLConnection Objekts SqlConnection cnn = new SqlConnection(); // Connection String setzen cnn.ConnectionString = "server=localhost;uid=sa;database=pubs"; // Öffnen der Connection cnn.Open(); Connection Objekt

15 Command Objekt Stellt ein auszuführendes Kommando dar Nicht unbedingt ein SQL Kommando Mit dem ADO.NET Command Objekt ist es möglich: Ein Statement, welches auf dem Server ausgeführt werden soll, zu definieren Parameter Informationen für dieses Kommando anzugeben Rückgabewerte nach der Kommandoausführung zu erhalten Wie das ADODB.Command Objekt Kann Parameter enthalten Werte, die bei Ausführung eines Statements genutzt werden können

16 // Create Command SqlCommand cmd = new SqlCommand(); // Aktive Connection des Kommandos und Inhalt setzen cmd.ActiveConnection = cnn; cmd.CommandText = "Select au_lname from authors where state // Parameter erzeugen und Werte setzen cmd.Parameters.Add( new typeof(String),2) ); = "CA"; Command Objekt

17 DataReader Der DataReader bietet einen forward-only, read-only Datenstrom Stellt die Ergebnisse einer ausgeführten Abfrage/Kommandos dar Der DataReader bietet die Möglichkeit … Einen Ergebnis-Datenstrom von einer Datenquelle zu erhalten Gleichbedeutend mit einem FO/RO RecordSet Unterstützt jedoch weder Scrolling noch Updates Auf Felder greift man am besten mit Hilfe von Accessoren (strongly typed, indexed) zu, die FieldsCollection ist die schlechtere Möglichkeit Performance myRow.GetInt(0) Zugriff über den Feldnamen (einfache Nutzung/Kompatibilität) myRow["fieldname"] Unterstützung von DataBinding in WebForms

18 // DataReader Definieren IDataReader dr; // Kommando ausführen cmd.Execute(out dr); // Ergebnisse auslesen while(dr.Read()) { Console.WriteLine("Name = " + dr["au_lname"]); } // Connection schließen cnn.Close(); DataReader Verwendung

19 DataSet Common client data store Relationale Sicht der Daten Tabellen, Spalten, Zeilen, Beschränkungen, Beziehungen Direkte Erzeugung von Metadaten einfaches Einfügen von Daten Explizites Cache Modell Disconnected, remotable Objekt Hat keine Kenntnis über die Datenquelle oder deren Eigenschaften Zugriff wie auf ein Array Strong Typing möglich DataSet Tables Table Columns Column Constraints Constraint Rows Row Relations Relation

20 DataSet // Erzeugen eines DataSet "PublicSet" DataSet pubs = new DataSet(" PublicSet"); //Erzeugen einer Tabelle bestand" DataTable inventory = new DataTable(bestand"); inventory.Columns.Add(kennzeichenID",typeof(Int32)); inventory.Columns.Add(menge",typeof(Int32)); // Tabelle Bestand zum DataSet PublicSet hinzufügen pubs.Tables.Add(bestand); // Datensatz zur Bestandstabelle hinzufügen DataRow row = bestand.NewRow(); row[kennzeichenID"]=1; row[menge"]=25; bestand.Rows.Add(row);

21 (Strongly) Typed DataSet DataSets, Tabellen, Zeilen als Objekte nutzen Spalten und Beziehungen als Eigenschaften //Ausgabe jedes Autors und dessen Titel foreach (Author myAuthor in Pubs.Authors.Rows) foreach (Author myAuthor in Pubs.Authors.Rows) { Console.WriteLine("Name = " + myAuthor.au_lname); Console.WriteLine("Name = " + myAuthor.au_lname); foreach (Title myTitle in myAuthor.Titles) foreach (Title myTitle in myAuthor.Titles) { Console.WriteLine("Title = " + myAuthor.Title); } }

22 DataAdapter Weiß, wie eine Tabelle aus der Datenbank geladen wird und schreibt Änderungen zurück Fill(DataSet) Update(DataSet) Mapping zwischen Tabellen und Spalten Benutzer kann die voreingestellten Kommandos überschreiben (insert/update/delete) z. B. um Stored Procedures anzugeben Default-Kommandos mit CommandBuilder erzeugen Erlaubt es, ein DataSet aus mehreren Datenquellen zu füllen

23 DataAdapter // Neues DataSetCommand SqlDataAdapter dsAdap = new SqlDataAdapter( "Select * from authors",cnn); // Daten an ein DataSet übergeben dsAdap.Fill(pubs, "Authors"); // Änderungen in den Kundendaten des DataSets durchführen und Update durchführen pubs.Tables["Authors"].Rows[0]["au_lname"]="smith"; SqlCommandBuilder bld = new SqlCommandBuilder(dsAdap); dsAdap.Update(pubs, "Authors");

24 DataBinding DataView Wie ein View auf eine Tabelle Erlaubt, Sortierreihenfolge und Filter in einem View einer Tabelle festzulegen Beliebige DataViews können von einer Tabelle erzeugt werden, um unterschiedliche Views der gleichen Tabelle möglich zu machen Wird für das DataBinding verwendet DataSetView Wie ein View, daß auf einem DataSet aufsetzt Sortierreihenfolge und Filter lassen sich setzen Erlaubt das Verbinden von DataViews Wird für das Databinding verwendet

25 DataBinding Als Quelle für DataBinding dienen: (DataReader) DataTable DataView DataSet DatSetView Array Collection IList IEnumerable

26 ADO.NET und XML DataSet und XML Lädt und speichert XML Daten im DataSet (in/out) Schema kann als XSD geladen/gespeichert werden Schema kann von XML Daten erzeugt werden (?!) Das DataSet kann mit einem XmlDataDocument assoziiert werden Stellt sich als relationaler View auf struktiertes XML dar Entsprechend dem DataSet Schema Erlaubt Strong Typing, Anbindung von Controls und relationalen Zugriff auf XML Daten Erhält das XML Dokument im Detail Stellt Daten gleichzeitig relational oder als XML zur Verfügung Semistrukturierte Daten Mit mehreren Tools auf gleiche Daten zugreifen

27 ADO.NET und XML // XmlDataDocument mit DataSet verbinden XmlDataDocument xmlDocument = new XmlDataDocument(pubs); // XmlNavigator für das XmlDataDocument anlegen DataDocumentNavigator xmlNavigator = new DataDocumentNavigator(xmlDocument); // alle Autoren aus Californien auslesen xmlNavigator.Select("//Authors[state='CA']/au_lname"); // Alle Nachnamen der Autoren ausgeben while(xmlNavigator.MoveToNextSelected()) { Console.WriteLine("Name = " + xmlNavigator.InnerText); }

28 Zusammenfassung ADO.NET ist die natürliche Weiterentwicklung von ADO Bekanntes Connection/Command Modell Teilung von Persistenz und Programmierung Optimierter ForwardOnly/ReadOnly Ergebnis-Datenstrom Expliziter, nicht verbundener relationaler Cache ADO.NET ist XML optimiert ADO.NET ist im.NET Framework integriert Exception Handling, Namensgebung, Notierung Bessere plattformübergreifende Zusammenarbeit und Sharing der Daten, bessere Skalierbarkeit, strong typing

29 ADO.NET Anwendungen

30 Überblick Szenen eines Datenzugriffs Aufwärmen: AutoNumber-Felder Logisches Löschen Joins & DataSets Jetzt wird es ernst: Hierarchische Daten laden Logisches Sperren Cool down: Eigene Datenquellen anbinden

31 AutoNumber-Felder AutoNumber-Information wird nicht autom. geladen Steht erst nach DataAdapter.FillSchema zur Verfügung DataColumn.AutoIncrementSeed/.AutoIn crementStep müssen gesetzt werden AutoNumber-Werte in DataTable können nicht in AutoNumber-DB-Felder persistiert werden Fremdschlüssel geraten aus dem Tritt Fazit: AutoNumber-Felder vermeiden!

32 Logisches Löschen Ein Datensatz wird im DataSet gelöscht, in der Datenbank jedoch nur als gelöscht markiert Lösung: Tabelle mit einer Spalte für ein Löschkennzeichen ausstatten DataAdapter mit speziellem Löschkommando ausstatten Update mytable set where

33 Joins & DataSets Einsatz bisher Anbinden von untergeordneten Informationen (Master/Detail) Anbinden von Lookup-Informationen Kein (semi)automatischer Update CommandBuilder generiert keine DML-Anweisungen für DataTables mit mehreren Tabellen Das ist gut so! Einsatz mit DataSets Untergeordnete Informationen über Relationen anbinden Es müssen mehrere Select-Anweisungen ausgeführt werden Where-Klauseln untergeordneter Select-Anweisungen müssen Where-Klauseln übergeordneter enthalten Lookup-Informationen entweder auch über Relationen oder weiterhin über Joins anbinden Fazit: Joins verlieren mit DataSets an Bedeutung Joins sind oft keine natürliche Darstellung von Datenbeziehungen

34 Hierarchische Daten laden Hierarchische Daten bilden oft eine logische Einheit: Dokumente DB-APIs kennen keine Dokumente Daten in Dokument-Granularität zu laden, entlastet Netzwerkverbindungen CRUD-Szenarien profitieren vom Denken in Dokumenten Dokumente definieren... Zugriff per Dokument-ID (PK des Wurzeldatensatzes) Dokumente mit eigenem API verwalten...

35 Hierarchische Daten laden

36 Mögliche Dokument-Definition

"> Mögliche Dokument-Definition <table name=

37 Hierarchische Daten laden Rudimentärer Dokument-API DataSet CreateDocument() DataSet GetDocument(string id) StoreDocument(doc as DataSet) DeleteDocument(string id) ToDos Dokument-Definition zuordnen DB-Anbindung Validation? Logisches Sperren?

38 Logisches Sperren Sperren von Datensätzen während einer (lange andauernden) Bearbeitung Probates Mittel: physikalisches Sperren via DB-API Das ist immer falsch! ADO.NET bietet dafür keine Mittel Lösung: Logisches Sperren Sperrungen werden durch Anwendung verwaltet Z.B. im Hauptspeicher, spezielle Tabelle

39 Logisches Sperren Herausforderungen Sicherstellen, dass alle Beteiligten die logischen Sperren beachten Datenzugriff darf nicht mehr direkt stattfinden, sondern nur über einen dedizierten API Wer (ent)sperrt wann? Was passiert mit zu lange gesperrten Daten? Z.B. weil der Client abgestürzt ist Performantes Sperren vs dauerhaftes Sperren

40 Eigene Datenquellen anbinden DataSets werden über Managed Provider gefüllt DataSets sind unabhängig von Datenquellen Managed Provider sind nicht auf Datenbanken festgelegt Managed Provider Klassen Datenquelle anbinden/manipulieren: Connection, Command Datenquelle lesen: DataReader, DataAdapter Datenquelle aktualisieren: DataAdapter A Simple Managed Provider Realisierung eines eigenen DataAdapter ist ausreichend Implementiert IDataAdapter

41 Fazit ADO.NET zwingt zum Umdenken Es gibt (fast) keine Cursor mehr DataReader ist heute eine Ausnahme DataSets sind in-memory Datencaches DataSets unterstützen eine oft natürlichere Sicht auf Daten ADO.NET bietet kaum Infrastruktur für einige typische Probleme Dokument-Handling SQL XML.NET Klassen mögen helfen Logisches Sperren Die Zukunft? ResultSets ObjectSpaces: OR-Mapping

42 Fragen!? Uff...

43 ADO.NET Quellen Jetzt lerne ich ADO.NET Ralf Westphal, 400 Seiten, Markt+Technik, 2002 (noch nicht erschienen) ADO.NET for the ADO Programmer ADO.NET : Migrating from beta 1 to beta 2 7LCYvBGK Coping with a New Beta - Connecting to Databases Coping with a New Beta - DataSetCommand to DataAdapter Using ADO+ and C# in the.NET Framework - Part 1 7LCYvBGK Using ADO+ and C# in the.NET Framework - Part 2 7LCYvBGK Revisiting the Use of ADO in.NET Applications Commands in ADO.NET Data Relations and Relatives Views and Filters Paradigmenwechsel mit ADO.NET

44 Über den Referenten Ralf Westphal ist freier Softwaretechnologievermittler. Er arbeitet als Fachautor, Coach/Berater, Softwareentwickler und Sprecher auf Konferenzen im In- und Ausland wie Microsoft Technical Summit, XML-in-Action, BASTA!, COMDEX, Software Development oder XML One. Der Schwerpunkt seiner Arbeit liegt bei der Vermittlung und Anwendung moderner Softwaretechnologien und -konzepte auf der Microsoft Plattform mit Fokus in den Bereichen OOP/komponentenorientierte Entwicklung, Softwarearchitektur und.NET Framework. Darüber hinaus ist Ralf Westphal einer der deutschen Microsoft MSDN Regional Directors, Mitglied verschiedener Fachbeiräte und war von 1998 bis 2001 Chefredakteur der Visual Basic Fachzeitschrift BasicPro.

45 Bücher des Referenten.NET kompakt 140 Seiten, Spektrum Akademischer Verlag, 2002, ISBN Jetzt lerne ich ADO.NET Einfache Datenbankprogrammierung im.NET- Framework 400 Seiten, Markt+Technik, 2002, ISBN (erscheint Mitte 2002)

46 Empower people through great software any time, any place, and on any device


Herunterladen ppt "ADO.NET Ralf Westphal Freier Fachautor & Berater MSDN Regional Director"

Ähnliche Präsentationen


Google-Anzeigen