Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Datenzugriff mit ADO.NET Dirk Primbs Technologieberater Microsoft Deutschland GmbH

Ähnliche Präsentationen


Präsentation zum Thema: "Datenzugriff mit ADO.NET Dirk Primbs Technologieberater Microsoft Deutschland GmbH"—  Präsentation transkript:

1 Datenzugriff mit ADO.NET Dirk Primbs Technologieberater Microsoft Deutschland GmbH

2

3 Ein Blick auf die Architektur Managed Provider DataReader Command Connection Sync Controls, Designers, Code-gen, etc DataSet XmlReader XmlText- Reader XmlNode- Reader XSL/T, X-Path, etc XmlData- Document DataAdapter

4 Das DataSet im Detail DataSet DataTableCollection DataTable DataView DataRowCollection DataColumnCollection DataRelationCollection

5 ADO.NET 2.0 Designziele Verbesserung der Performance (~30%) Weniger Code No breaking changes! Designziele Verbesserung der Performance (~30%) Weniger Code No breaking changes!

6 ADO.NET 2.0 SQL Server Yukon Features Notification Services XML Data Types Bulk Copy Multiple Active Resultsets (MARS) Common Provider Model DataSet Automatische Ermittlung von Beziehungen Binary Serialization SQL Server Yukon Features Notification Services XML Data Types Bulk Copy Multiple Active Resultsets (MARS) Common Provider Model DataSet Automatische Ermittlung von Beziehungen Binary Serialization

7 Provider-Factories Enumerieren vorhandener ADO.NET-Provider DbProviderFactories.GetFactoryClasses() Dynamisches Erzeugen aller wichtigen Objekte Enumerieren vorhandener ADO.NET-Provider DbProviderFactories.GetFactoryClasses() Dynamisches Erzeugen aller wichtigen Objekte DbProviderFactory provFactory = DbProviderFactories.GetFactory("System.Data.SqlClient"); DbDataAdapter da = provFactory.CreateDataAdapter(); da.Connection = provFactory.CreateConnection(); da.Connection.ConnectionString = "..."; da.SelectCommand = provFactory.CreateCommand(); da.SelectCommand.CommandText = "select * from customers"; da.Fill(ds);

8 © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

9 Anhang

10 Einführung in ADO.NET Kein einfacher Nachfolger von ADO Neues Paradigma und Objektmodell Architektur Schwerpunkt: Daten losgelöst von der Datenbank zu bearbeiten Anders anzuwenden, macht aber auch vieles einfacher z.B. Implementierung eigener Provider Kein einfacher Nachfolger von ADO Neues Paradigma und Objektmodell Architektur Schwerpunkt: Daten losgelöst von der Datenbank zu bearbeiten Anders anzuwenden, macht aber auch vieles einfacher z.B. Implementierung eigener Provider

11 Ein Blick auf die Architektur Managed Provider DataReader Command Connection Sync Controls, Designers, Code-gen, etc DataSet XmlReader XmlText- Reader XmlNode- Reader XSL/T, X-Path, etc XmlData- Document DataAdapter

12 Managed Provider Um auf Daten zuzugreifen benötigt man einen Managed Provider Der Managed Provider implementiert die notwendigen Schnittstellen IDbConnection IDbCommand IDataReader Diese Schnittstellen sind im Namespace System.Data beschrieben Um auf Daten zuzugreifen benötigt man einen Managed Provider Der Managed Provider implementiert die notwendigen Schnittstellen IDbConnection IDbCommand IDataReader Diese Schnittstellen sind im Namespace System.Data beschrieben

13 Managed Provider II Zwei Provider sind bei der Visual Studio.NET Version dabei SQL Server Managed Provider System.Data.SqlClient OLEDB Managed Provider System.Data.OleDb Zwei weitere sind noch verfügbar Oracle Managed Provider ODBC Managed Provider zu finden unter Zwei Provider sind bei der Visual Studio.NET Version dabei SQL Server Managed Provider System.Data.SqlClient OLEDB Managed Provider System.Data.OleDb Zwei weitere sind noch verfügbar Oracle Managed Provider ODBC Managed Provider zu finden unter

14 Das Connection Objekt Mit dem Connection Objekt wird die Verbindung zur Datenquelle hergestellt using System.Data; using System.Data.SqlClient;... public void ConnectToDatabase() { SqlConnection conn = new SqlConnection(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = {providerspecific string}; conn.ConnectionString = {providerspecific string}; conn.Open(); conn.Open();}

15 Das Command Objekt Das Command Objekt führt die entsprechenden Befehle gegen die Datenquelle aus In der Regel SQL Statements Bei manchen Providern auch andere Statements Command Objekte können referenzen auf andere Objekte zurückgeben z.B. ExecuteReader() Das Command Objekt führt die entsprechenden Befehle gegen die Datenquelle aus In der Regel SQL Statements Bei manchen Providern auch andere Statements Command Objekte können referenzen auf andere Objekte zurückgeben z.B. ExecuteReader()

16 Das Command Objekt II Benötigt eine Connection Optional auch eigene Transaktion Benötigt eine Connection Optional auch eigene Transaktion using System.Data; using System.Data.SqlClient;... public void ExecuteSomething() { SqlCommand cmd = new SqlCommand( DELETE FROM a ); SqlCommand cmd = new SqlCommand( DELETE FROM a ); cmd.ExecuteNoQuery(); cmd.ExecuteNoQuery();......}

17 Das DataReader Objekt Über das Reader Objekt werden die Daten aus einem Resultset ausgelesen Nur Vorwärtslesen möglich! Über das Reader Objekt werden die Daten aus einem Resultset ausgelesen Nur Vorwärtslesen möglich!... public void ReadData() { SqlDataReader reader = cmd.ExecuteReader(); SqlDataReader reader = cmd.ExecuteReader(); while( reader.Read() ) while( reader.Read() ) { Console.WriteLine( reader.GetString( 1 ) ); } { Console.WriteLine( reader.GetString( 1 ) ); }......}

18 DataAdapter und DataSet Daten können aus der Datenquelle in ein Objekt gelesen werden DataSet Daten können aus diesem Objekt wieder in die Datenquelle geschrieben werden durch den DataAdapter Daten können aus der Datenquelle in ein Objekt gelesen werden DataSet Daten können aus diesem Objekt wieder in die Datenquelle geschrieben werden durch den DataAdapter

19 Das DataAdapter Objekt Die Brücke zwischen Datenquelle und DataSet Öffnet die Verbindung automatisch falls noch nicht offen Schliesst die Verbindung automatisch falls diese selbst geöffnet wurde Die wichtigsten Methoden hierbei sind Fill() Update() Die Brücke zwischen Datenquelle und DataSet Öffnet die Verbindung automatisch falls noch nicht offen Schliesst die Verbindung automatisch falls diese selbst geöffnet wurde Die wichtigsten Methoden hierbei sind Fill() Update()

20 Das DataAdapter Objekt II Als Grundlage dienen 4 Statements SelectCommand InsertCommand DeleteCommand UpdateCommand Das CommandBuilder Objekt kann dabei fehlende Befehle selbst erzeugen Als Grundlage dienen 4 Statements SelectCommand InsertCommand DeleteCommand UpdateCommand Das CommandBuilder Objekt kann dabei fehlende Befehle selbst erzeugen

21 Das DataSet Objekt Das zentrale Element für Datenbearbeitung Ein Objekt das Daten im Speicher der Anwendung hält Hat keinerlei Information woher die Daten kamen und wohin diese gehen Das weiß der DataAdapter Das zentrale Element für Datenbearbeitung Ein Objekt das Daten im Speicher der Anwendung hält Hat keinerlei Information woher die Daten kamen und wohin diese gehen Das weiß der DataAdapter

22 Das DataSet Objekt Direkte Nutzung der Klasse DataSet ds = new DataSet(); Man kann auch eine typisierte Version des Objektes nutzen Eine Ableitung von DataSet die das Layout der Tabelle als Klasse wiedergibt Ein Code Generator erzeugt diese Klasse Direkte Nutzung der Klasse DataSet ds = new DataSet(); Man kann auch eine typisierte Version des Objektes nutzen Eine Ableitung von DataSet die das Layout der Tabelle als Klasse wiedergibt Ein Code Generator erzeugt diese Klasse

23 Das DataSet im Detail DataSet DataTableCollection DataTable DataView DataRowCollection DataColumnCollection DataRelationCollection

24 DataSet im Detail Enthält also Tabellen, Relationen, Views und Constraints Eine kleine In-Memory Datenbank Daten werden XML basiert behandelt! DataSets basieren auf XML Schemas DataSets können mit XmlDataDocument synchronisiert werden Enthält also Tabellen, Relationen, Views und Constraints Eine kleine In-Memory Datenbank Daten werden XML basiert behandelt! DataSets basieren auf XML Schemas DataSets können mit XmlDataDocument synchronisiert werden

25 Datenbindung in.NET DataBinding herstellen einer Verbindung zwischen Datencontainer und Datenelement Datenbindung mit jeglichem Objekt möglich DataSet Array DataReader eigene Objekte Bestimmte Schnittstellen müssen Implementiert werden DataBinding herstellen einer Verbindung zwischen Datencontainer und Datenelement Datenbindung mit jeglichem Objekt möglich DataSet Array DataReader eigene Objekte Bestimmte Schnittstellen müssen Implementiert werden

26 Arten von Datenbindung Zwei unterschiedliche Arten von Bindung Einfache Datenbindung komplexe Datenbindung Die Relation zwischen einem Anzeigeelement und einem Datenelement z.B. TextBox.Text = Customers.Lastname Oder zwischen einem Steuerelement und einem Datencontainer z.B. DataGrid.DataSource = DataSet Zwei unterschiedliche Arten von Bindung Einfache Datenbindung komplexe Datenbindung Die Relation zwischen einem Anzeigeelement und einem Datenelement z.B. TextBox.Text = Customers.Lastname Oder zwischen einem Steuerelement und einem Datencontainer z.B. DataGrid.DataSource = DataSet

27 Herstellen der Bindung Die Datenbindung kann während des Anwendungsdesigns gemacht werden zur Laufzeit gemacht werden Bindungen können jeder Zeit wieder gelöst und neu getätigt werden Das BindingManager Objekt verwaltet diese Datenbindungen Die Datenbindung kann während des Anwendungsdesigns gemacht werden zur Laufzeit gemacht werden Bindungen können jeder Zeit wieder gelöst und neu getätigt werden Das BindingManager Objekt verwaltet diese Datenbindungen

28 ADO.NET und XML XML ist die Grundlage von ADO.NET Daten können in beide Richtungen ausgetauscht werden DataSet -> XmlDataDocument XmlDataDocument -> DataSet Neue Möglichkeiten mit relationalen Daten zu arbeiten Hierarchische Sichtweise XPath Queries XSLT Umwandlungen XML ist die Grundlage von ADO.NET Daten können in beide Richtungen ausgetauscht werden DataSet -> XmlDataDocument XmlDataDocument -> DataSet Neue Möglichkeiten mit relationalen Daten zu arbeiten Hierarchische Sichtweise XPath Queries XSLT Umwandlungen

29 Zusammenfassung ADO.NET ist ein neu zu erlernendes Objektmodell Aber es ist einfacher zu benutzen Und einfacher zu erweitern Bietet volle Zugriffsmöglichkeit auf relationale und XML basierte Datenbestände ADO.NET ist ein neu zu erlernendes Objektmodell Aber es ist einfacher zu benutzen Und einfacher zu erweitern Bietet volle Zugriffsmöglichkeit auf relationale und XML basierte Datenbestände

30 ADO.NET 2.0 Dirk Primbs Technologieberater Microsoft Deutschland GmbH Dirk Primbs Technologieberater Microsoft Deutschland GmbH

31 Agenda ADO.NET 2.0 im Überblick ADO.NET most wanted Einfacher Schneller Unterstützung für SQL Server "Yukon" Demos, Demos, Demos,... ADO.NET 2.0 im Überblick ADO.NET most wanted Einfacher Schneller Unterstützung für SQL Server "Yukon" Demos, Demos, Demos,...

32 Ziele bei der Entwicklung von ADO.NET 2.0 Evolution, nicht Revolution Umsetzen von Kundenwünschen Viele Features wurden durch Kundenwunsch getrieben Mehr Möglichkeiten für Spezialisten Performance, Performance, Performance Support für SQL Server "Yukon" als First Class Feature Evolution, nicht Revolution Umsetzen von Kundenwünschen Viele Features wurden durch Kundenwunsch getrieben Mehr Möglichkeiten für Spezialisten Performance, Performance, Performance Support für SQL Server "Yukon" als First Class Feature Keine fundamentalen Änderungen des Objektmodells! Was unter ADO.NET 1.1 funktioniert, geht auch unter Whidbey!

33 Top 3 Kundenwünsche Paging großer Datenmengen automatische Übernahme von Beziehungen in typisierten DataSets Serverseitiger Cursor Paging großer Datenmengen automatische Übernahme von Beziehungen in typisierten DataSets Serverseitiger Cursor

34 Paging von Abfrageergebnissen Häufiger Wunsch besonders von Web-Entwicklern HTTP ist zustandslos zu übertragende Datenmenge ist performance-kritisch SqlCommand.ExecutePageReader() Optional von Datenprovidern implementierbar Nutzt bei SQL Server intern Stored Procedures sp_cursoropen und sp_cursorfetch Häufiger Wunsch besonders von Web-Entwicklern HTTP ist zustandslos zu übertragende Datenmenge ist performance-kritisch SqlCommand.ExecutePageReader() Optional von Datenprovidern implementierbar Nutzt bei SQL Server intern Stored Procedures sp_cursoropen und sp_cursorfetch

35 Beziehungen und typisierte DataSets Bisher mußten Beziehungen zwischen Datentabellen manuell am DataSet modelliert werden ds.Relations.Add() In Whidbey können diese Beziehungen automatisiert ermittelt und auf das DataSet angewandt werden Bisher mußten Beziehungen zwischen Datentabellen manuell am DataSet modelliert werden ds.Relations.Add() In Whidbey können diese Beziehungen automatisiert ermittelt und auf das DataSet angewandt werden

36 Serverseitiger Cursor Nur einsetzen, wenn unbedingt notwendig! Kann Resourcen-/Skalierungsprobleme verursachen SqlCommand.ExecuteResultSet(); Als Scrollable und als Updatable möglich Nur einsetzen, wenn unbedingt notwendig! Kann Resourcen-/Skalierungsprobleme verursachen SqlCommand.ExecuteResultSet(); Als Scrollable und als Updatable möglich SqlConnection sqlConn = new SqlConnection(strConn); SqlCommand sqlCmd = sqlConn.CreateCommand(); sqlCmd.CommandText = strSQL; sqlResultSet sqlResults = sqlCmd.ExecuteResultSet(ResultSetOptions.Updatable | ResultSetOptions.Scrollable);

37 Provider-Factories Enumerieren vorhandener ADO.NET-Provider DbProviderFactories.GetFactoryClasses() Dynamisches Erzeugen aller wichtigen Objekte Enumerieren vorhandener ADO.NET-Provider DbProviderFactories.GetFactoryClasses() Dynamisches Erzeugen aller wichtigen Objekte DbProviderFactory provFactory = DbProviderFactories.GetFactory("System.Data.SqlClient"); DbDataAdapter da = provFactory.CreateDataAdapter(); da.Connection = provFactory.CreateConnection(); da.Connection.ConnectionString = "..."; da.SelectCommand = provFactory.CreateCommand(); da.SelectCommand.CommandText = "select * from customers"; da.Fill(ds);

38 Enumerieren…... durch alle verfügbaren Provider... durch Serverinstanzen im Netzwerk... durch alle verfügbaren Provider... durch Serverinstanzen im Netzwerk DataTable sources = SqlDataSourceEnumerator.Instance.GetDataSources(); foreach( DataRow dr in sources.Rows ) { Console.WriteLine("{0}", dr["Name"]); } DataTable providers = DbProviderFactories.GetFactoryClasses(); foreach (DataRow dr in providers.Rows) { Console.WriteLine("Name: {0}, Invariantname: {1}", dr["Name"], dr["Invariantname"] }

39 Asynchroner Datenzugriff Ideal überall dort wo das Blockieren des Ausführungsthreads verhindert werden soll Client-Applikationen: UI-Thread Server-Applikationen BeginOpen, EndOpen, BeginExecute, … Integrierbar in 3 rd Party Providers ADO.NET 2.0 unterstützt asynchronen Zugriff bei SQL Server 7, 2000 und Yukon Ideal überall dort wo das Blockieren des Ausführungsthreads verhindert werden soll Client-Applikationen: UI-Thread Server-Applikationen BeginOpen, EndOpen, BeginExecute, … Integrierbar in 3 rd Party Providers ADO.NET 2.0 unterstützt asynchronen Zugriff bei SQL Server 7, 2000 und Yukon

40 DataSet Performance Remoting Ein häufiger Hinweis unserer Kunden: DataSets sind langsam, wenn man sie mit Remoting benutzt Deshalb… Datasets unterstützen jetzt "binary serialization" Deutlich schnelleres serialize/deserialize Deutlich weniger Speicherverbrauch Neues, schnelleres Indexing Speziell bei Insert deutliche Performancesteigerungen Remoting Ein häufiger Hinweis unserer Kunden: DataSets sind langsam, wenn man sie mit Remoting benutzt Deshalb… Datasets unterstützen jetzt "binary serialization" Deutlich schnelleres serialize/deserialize Deutlich weniger Speicherverbrauch Neues, schnelleres Indexing Speziell bei Insert deutliche Performancesteigerungen

41 Bulk Copy beschleunigt das Kopieren größerer Datenmengen SqlBulkCopyOperation kann DataReader oder DataTable als Datenquelle verwenden deutlich bessere Performance als entsprechende Insert-Kommandos beschleunigt das Kopieren größerer Datenmengen SqlBulkCopyOperation kann DataReader oder DataTable als Datenquelle verwenden deutlich bessere Performance als entsprechende Insert-Kommandos

42 Batch Updates ADO.NET 1.0/1.1: DataAdapter.Update() erzeugt pro Row einen Roundtrip zum Server In Whidbey kann blockweise geupdatet werden: adapter.UpdateBatchSize = your_batch_size Verfügbar für SqlClient and OracleClient Batches können innerhalb einer Transaktion durchgeführt werden Dazu Transaktionsobjekt der Commands am Dataadapter setzen ADO.NET 1.0/1.1: DataAdapter.Update() erzeugt pro Row einen Roundtrip zum Server In Whidbey kann blockweise geupdatet werden: adapter.UpdateBatchSize = your_batch_size Verfügbar für SqlClient and OracleClient Batches können innerhalb einer Transaktion durchgeführt werden Dazu Transaktionsobjekt der Commands am Dataadapter setzen

43 Multiple Active Result-Sets Mehr als ein aktiver Request pro Connection- Objekt Mehrer aktive DataReader Ausführung von Batches zwischen Read() und Read() Ein aktiver DataReader pro Command-Objekt basiert auf SQL Server "Yukon" MARS Mehr als ein aktiver Request pro Connection- Objekt Mehrer aktive DataReader Ausführung von Batches zwischen Read() und Read() Ein aktiver DataReader pro Command-Objekt basiert auf SQL Server "Yukon" MARS System.InvalidOperationException: There is already an open DataReader associated with this Connection which must be closed first.

44 Benutzerdefinierte Datentypen CLR-Typen direkt in die Datenbank schreiben Nahtlose Integration in ADO.NET Übergabe der Objekte durch … … datareader.GetValue … Parameter.Value=… Wird in SQL Server "Yukon" unterstützt CLR-Typen direkt in die Datenbank schreiben Nahtlose Integration in ADO.NET Übergabe der Objekte durch … … datareader.GetValue … Parameter.Value=… Wird in SQL Server "Yukon" unterstützt

45 SQL Server XML Datentyp Nahtlose Integration Einfach nur ein Typ DataReader SqlDataReader.GetSqlXmlReader Parameter Einfach einen XmlReader oder einen string übergeben DataSet Ansteuerbar als XPathDocument Hinweis: In der Alpha-Version von Whidbey enthält das DataSet statt dessen einen XmlReader Nahtlose Integration Einfach nur ein Typ DataReader SqlDataReader.GetSqlXmlReader Parameter Einfach einen XmlReader oder einen string übergeben DataSet Ansteuerbar als XPathDocument Hinweis: In der Alpha-Version von Whidbey enthält das DataSet statt dessen einen XmlReader

46 Common Provider Model ADO.NET v1.0/1.1 basiert auf Interfaces Reicht nicht immer aus um providerunabhängigen Code zu schreiben Aufwändige Implementation für eigene Provider notwendig Deshalb: ein gemeinsames Basis-Objektmodell Abstrakte Basisklassen statt Interfaces Vereinfacht die Versionierung 3 rd Party Provider können ADO.NET Basisfunktionalität mitbenutzen. z.B. ADO.NET Connection Pooler Ideale Grundlage für Provider-unabhängige Applikationen Basisklassen sind eine Erweiterung des bisherigen Modells => Keine Kompatibilitätsprobleme ADO.NET v1.0/1.1 basiert auf Interfaces Reicht nicht immer aus um providerunabhängigen Code zu schreiben Aufwändige Implementation für eigene Provider notwendig Deshalb: ein gemeinsames Basis-Objektmodell Abstrakte Basisklassen statt Interfaces Vereinfacht die Versionierung 3 rd Party Provider können ADO.NET Basisfunktionalität mitbenutzen. z.B. ADO.NET Connection Pooler Ideale Grundlage für Provider-unabhängige Applikationen Basisklassen sind eine Erweiterung des bisherigen Modells => Keine Kompatibilitätsprobleme

47 Gemeinsame Basisklassen System.Data.ProviderBase Abstrakte Basisklassen für alle wichtigen Providerobjekte Können in eigenen Providern als Ableitungsbasis verwendet und um eigene Funktionalität ergänzt werden System.Data.ProviderBase Abstrakte Basisklassen für alle wichtigen Providerobjekte Können in eigenen Providern als Ableitungsbasis verwendet und um eigene Funktionalität ergänzt werden

48 Was sonst noch… Integration mit System.Transactions Tracing Connection pool reset API DataSet DataTable losgelöster von DataSet DataSet.Load DataTableReader Integration mit System.Transactions Tracing Connection pool reset API DataSet DataTable losgelöster von DataSet DataSet.Load DataTableReader SqlClient Notifications SQL Server Yukon Typen varchar/varbinary(max) Change password on login Promotable transactions More to come… OleDb Managed pooling option

49 Zusammenfassung Whidbey: Änderungen basieren größtenteils auf Kundenfeedback Features, Performance, Usability Integration SQL Server Yukon wird nativ unterstützt Evolution statt Revolution Keine Kompatibilitätsprobleme Whidbey: Änderungen basieren größtenteils auf Kundenfeedback Features, Performance, Usability Integration SQL Server Yukon wird nativ unterstützt Evolution statt Revolution Keine Kompatibilitätsprobleme


Herunterladen ppt "Datenzugriff mit ADO.NET Dirk Primbs Technologieberater Microsoft Deutschland GmbH"

Ähnliche Präsentationen


Google-Anzeigen