Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

28
1 oftwareentwicklung mit .NE eil 4 DO.NET r. Ralph Zeller

description

Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller. Was ist ADO.NET?. ADO.NET (ActiveX Data Objects .NET) sind Klassen die Datenzugriffsdienste im .NET Framework bereitstellen. Microsoft .NET Framework. Web Services. User Interface. Data and XML. ADO.NET. XML. Base Classes. - PowerPoint PPT Presentation

Transcript of Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

Page 1: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

1

Softwareentwicklung mit .NETTeil 4

ADO.NET

Dr. Ralph Zeller

Page 2: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

2

Was ist ADO.NET?

ADO.NET (ActiveX Data Objects .NET) sind Klassen die Datenzugriffsdienste im .NET Framework bereitstellen.

Microsoft .NET Framework

Common Language Runtime

Base Classes

Web Services User Interface

Data and XML

ADO.NET XML ... ...

Page 3: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

3

Motivation Warum eine neue Schnittstelle für den

Datenzugriff?

• Web Applikationen benötigen andere Architektur

• Lose Kopplung zwischen Applikation und Daten

• XML entwickelt sich zum universellen Datenformat

Problem mit bestehenden APIs

• ADO, OLE DB und ODBC: wurden für enge Kopplung und dauerhafte Verbindung konzipiert

• Remote Data Services, RDS: für nichtverbundene (disconnectet) Verbindungen. Kein Zustands-management zwischen request/response

Relationales vs. hierarchisches Datenmodell

Page 4: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

4

ADO.NET Objekt Modell

Explizite Unterscheidung zwischen connected und disconnected Objekt Modell

Data Provider für connected Zugriff

DataSet bietet Funktionalität für disconnected Datenobjekte

Page 5: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

5

Data Provider Klassen, die den Zugriff auf Datenquellen

managen

• Connection: Herstellung einer Verbindung zur Datenquelle

• Command: Zum Ausführen der Befehle

• DataReader: Liefert die Ergebnisse einer Abfrage

• DataAdapter: Verbindet das DataSet mit der Datenquelle

Page 6: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

6

Data Provider SQL Server .NET Data Provider:

• SQL Server 2000, SQL Server 7, MSDE

• Verwendet eigenes Kommunikationsprotokoll (TDS)

• Zugriff via System.Data.SQL Namespace

OleDb .NET Data Provider:

• SQLOLEDB – OLE DB provider für SQL Server

• MSDAORA – OLE DB provider für Oracle

• Microsoft.Jet.OLEDB.4.0 für Microsoft Jet

• Zugriff via System.Data.OleDb Namespace

ODBC .NET Data Provider:

• http://msdn.microsoft.com/downloads/sample.asp?url=/msdn-files/027/001/668/msdncompositedoc.xml

Page 7: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

7

Connection Objekt

Repräsentiert eine Verbindung zu einer Datenquelle

Die Verbindung zur Datenquelle ändern (create, open, close)

Transaktionen handhaben (begin, commit, abort)

String conStr="Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=Provider.mdb";OleDbConnection conn = new OleDbConnection(conStr);conn.Open();// Queries mit OleDbCommand ausführenconn.Close();

String conStr="Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=Provider.mdb";OleDbConnection conn = new OleDbConnection(conStr);conn.Open();// Queries mit OleDbCommand ausführenconn.Close();

Page 8: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

8

Command Objekt

OleDbCommand cmd = new OleDbCommand();// Command mit Connection und Query String verbindencmd.ActiveConnection = conn;cmd.CommandText = "SELECT * FROM Kunden";

OleDbCommand cmd = new OleDbCommand();// Command mit Connection und Query String verbindencmd.ActiveConnection = conn;cmd.CommandText = "SELECT * FROM Kunden";

Repräsentiert eine Abfrage (Query) einer Datenquelle

Interessante Properties:• ActiveConnection: Verbindung zur Datenquelle

• CommandText: Enthält Query String

• CommandType: Wie ist Command Text zu interpretieren (Text, stored procedure, table name)

• CommandTimeout: Sekunden bis zum Timeout

• RecordsAffected: Anzahl der betroffenen Datensätze

Page 9: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

9

ExecuteNonQuery Wird verwendet, wenn keine Daten

zurückgegeben werden

Insert, Update, Delete, Stored Proc,Data Defimition Language (DDL)• Create Table, Create Index, …

string conStr = "CREATE TABLE Abomodell " + "(AMNr LONG NOT NULL, Name CHAR(20) NOT NULL, " + "Grundgebuehr CURRENCY, Zeitgebuehr CURRENCY, " + "FreiStd LONG)"; // OleDBCommand Objekt anlegenOleDbCommand cmd = new OleDbCommand(conStr, conn);

// Bei Kommandoausführung werden keine Daten zurückgegebenInt32 RowsAffected = cmd.ExecuteNonQuery();

string conStr = "CREATE TABLE Abomodell " + "(AMNr LONG NOT NULL, Name CHAR(20) NOT NULL, " + "Grundgebuehr CURRENCY, Zeitgebuehr CURRENCY, " + "FreiStd LONG)"; // OleDBCommand Objekt anlegenOleDbCommand cmd = new OleDbCommand(conStr, conn);

// Bei Kommandoausführung werden keine Daten zurückgegebenInt32 RowsAffected = cmd.ExecuteNonQuery();

Page 10: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

10

ExecuteScalar

Wird verwendet, um einen einzelnen Wert zu holen

// OleDBCommand Objekt anlegenOleDbCommand cmd = new OleDbCommand( "SELECT Name FROM Abomodell " + "WHERE AboID = @Abo_ID", conn);

// Übergabeparameter wird erzeugt und initialisiertcmd.Parameters.Add("@Abo_ID", aboID);

// Name wird zurückgegebenstring aboName = (string)cmd.ExecuteScalar();

// OleDBCommand Objekt anlegenOleDbCommand cmd = new OleDbCommand( "SELECT Name FROM Abomodell " + "WHERE AboID = @Abo_ID", conn);

// Übergabeparameter wird erzeugt und initialisiertcmd.Parameters.Add("@Abo_ID", aboID);

// Name wird zurückgegebenstring aboName = (string)cmd.ExecuteScalar();

Page 11: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

11

DataReader Objekt

Der DataReader bietet uns die Möglichkeit …• Einen Ergebnis-Datenstrom von einer Datenquelle

zu erhalten

Der Datenstrom kann nur in einer Richtung ausgelesen werden (forward-only, read-only) • Unterstützt jedoch weder Scrolling noch Updates

Datenzugriffsmethoden: • Mit Spaltenname und Index: myRow.GetString(0)

• Über Feldnamen: myRow[“Feldname”]

• Read: Bewegt den Reader zum nächsten Datensatz

Page 12: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

12

DataReaderBeispiel 1: Internet Provider

Page 13: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

13

DataSet Objekt Lokaler Cache für Daten

• Ähnlich einer relationalen Datenbank, die im Arbeitsspeicher liegt

• Sind disconnected von der Datenquelle(Connect, execute query, disconnect)

Universeller Datencontainer• Nicht nur zur Verwendung mit Datenbanken

Daten werden in XML geholt und zurückgeschrieben

Page 14: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

14

DataSet

DataSet Tables

DataTable

Relations

DataRelation

DataRelation

DataRow(s)

DataColumn

Constraint(s)

DataTable

DataTable

DataSets enthalten Tabellen, Spalten, Relationen, Bedingungen, Zeilen

Page 15: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

15

DataAdapter

weiß, wie eine Tabelle aus der Datenbank geladen wird und schreibt Änderungen zurück• enthält zwei Methoden:

• Fill(DataSet)

• Update(DataSet)

• Mapping zwischen Tabellen und Spalten

• Benutzer kann die voreingestellten Kommandos überschreiben (insert/update/delete)

• z. B. um Stored Procedures anzugeben

• Erlaubt es, ein DataSet aus mehreren Datenquellen zu füllen

Page 16: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

16

DataSetBeispiel 2: AboModell anzeigen

Page 17: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

17

DataSetBeispiel 3: AboModell updaten

Page 18: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

18

DataTable

Kann auf eine physische Tabelle in der Datenquelle gemapped sein.

Kann durch DataRelations mit anderen DataTables verbunden sein

Interessante Properties:

• Columns

• Rows

• ParentRelation

• Constraints

• PrimaryKey

Page 19: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

19

DataSet und DataTable

DataSet ds = new DataSet();

// Neues DataTable Objekt erzeugenDataTable dt = new DataTable( "Abomodell" );

// Spalten erzeugen und einfügenDataColumn dc = new DataColumn( "AboID", Int32 );dt.Columns.Add( dc );

dt.Columns.Add( "Name", String );dt.Columns.Add( "Grundgebuehr", Currency );dt.Columns.Add( "Zeitgebuehr", Currency );dt.Columns.Add( "FreiStd", Int32 );

// DataTable Objekt in DataSet einfügends.Tables.Add( dt );

DataSet ds = new DataSet();

// Neues DataTable Objekt erzeugenDataTable dt = new DataTable( "Abomodell" );

// Spalten erzeugen und einfügenDataColumn dc = new DataColumn( "AboID", Int32 );dt.Columns.Add( dc );

dt.Columns.Add( "Name", String );dt.Columns.Add( "Grundgebuehr", Currency );dt.Columns.Add( "Zeitgebuehr", Currency );dt.Columns.Add( "FreiStd", Int32 );

// DataTable Objekt in DataSet einfügends.Tables.Add( dt );

DataTable Objekt erzeugen und einfügen

Page 20: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

20

DataRelation

Wird für logische Relationen verwendet

• Erzeugt Relation zwischen zwei (2) DataTable Objekten

• Benötigt ein DataColumn Objekt von jedem DataTable Objekt

• Der DataType beider DataColumns muss gleich sein

• Es kann keine Int32 DataColumn mit einem String DataColumn verbunden werden

• Die Relation bekommt einen Namen (von Dir!)

Macht relationale Navigation möglich

DataRelation dr = new DataRelation("myRelation",...)DataRelation dr = new DataRelation("myRelation",...)

Page 21: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

21

DataSet und DataRelation

DataColumn parentCol, childCol;parentCol = DataSet.Tables["Kunden"].Columns["AboID"];childCol = DataSet.Tables["Abomodell"].Columns["AboID"];

// Erzeuge die DataRelation mit Namen "Kde_Abo"DataRelation dr; dr = New DataRelation("Kde_Abo", parentCol, childCol); // DataRelation zu DataSet hinzufügen ds.Relations.Add( dr );

DataColumn parentCol, childCol;parentCol = DataSet.Tables["Kunden"].Columns["AboID"];childCol = DataSet.Tables["Abomodell"].Columns["AboID"];

// Erzeuge die DataRelation mit Namen "Kde_Abo"DataRelation dr; dr = New DataRelation("Kde_Abo", parentCol, childCol); // DataRelation zu DataSet hinzufügen ds.Relations.Add( dr );

Wie wird eine DataRelation erzeugt:• Suche die zu verbindenden DataColumn

Objekte

• Erzeuge die DataRelation mit den Columns

• Füge die Relation in das DataSet ein

Page 22: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

22

DataRelation Navigation

// Kurzversion zur Erzeugung einer DataRelationds.Relations.Add("Kde_Abo", ds.Tables["Kunden"].Columns["AboID"], ds.Tables["Abomodell"].Columns["AboID"]);

// Navigiere durch die verknüpften Tabellenforeach (DataRow custRow in ds.Tables["Kunden"].Rows){ Console.WriteLine(custRow["KundeID"]);

foreach (DataRow orderRow in custRow.GetChildRows(Kde_Abo)){ Console.WriteLine(orderRow["AboID"]); }}

// Kurzversion zur Erzeugung einer DataRelationds.Relations.Add("Kde_Abo", ds.Tables["Kunden"].Columns["AboID"], ds.Tables["Abomodell"].Columns["AboID"]);

// Navigiere durch die verknüpften Tabellenforeach (DataRow custRow in ds.Tables["Kunden"].Rows){ Console.WriteLine(custRow["KundeID"]);

foreach (DataRow orderRow in custRow.GetChildRows(Kde_Abo)){ Console.WriteLine(orderRow["AboID"]); }}

Page 23: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

23

DataSet und XML DataSet bietet Methoden mit denen man XML

lesen und schreiben kann

• ReadXml: Liest XML Daten in ein DataSet,Schemainformationen nur wenn vorhanden

• ReadXmlSchema: Liest XML Schema in ein DataSet

• Zum Schreiben: WriteXml, WriteXmlSchema

Schema kann als XSD geladen/gespeichert werden

Schema kann automatisch aus DataSet erzeugt werden

Page 24: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

24

DataSet und XMLBeispiel 4: XML Dateien schreiben/lesen

Page 25: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

25

ADO.NET und ASP.NET Datenbank Kommandos

• Transaktionen (Updates, Inserts, etc.)

• DataReader für den Zugriff auf Datenströme

• WebControls füllen, HTML Tabellen aufbauen DataSet

• Anwendungsdaten (Einkaufswagen)

• Ergebnisse cachen (häufige Abfrageergebnisse)

• Daten in einem WebRequest spiegeln XML

• Transformationen (XSL/T)

• Validierung (XSD, XDR, DTD)

• B2B Austausch (BizTalk)

• Erreichbarkeit einer großen Client Palette

Page 26: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

26

Web Forms Databinding<%@ Import Namespace="System.Data.OleDb" %><html><head><script language="C#" runat=server>

public void Page_Load(Object sender, EventArgs e) { OleDbConnection conn = new OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=Provider.mdb"); conn.Open(); OleDbCommand cmd = new OleDbCommand( "SELECT * FROM Abomodell", conn); OleDbDataReader results = cmd.ExecuteReader();

// Rückgabe des DataReaders an Control binden ActivityList.DataSource = results; ActivityList.DataBind(); conn.Close(); }</script></head><body> <asp:DataGrid id="ActivityList" runat="server"/></body></html>

<%@ Import Namespace="System.Data.OleDb" %><html><head><script language="C#" runat=server>

public void Page_Load(Object sender, EventArgs e) { OleDbConnection conn = new OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=Provider.mdb"); conn.Open(); OleDbCommand cmd = new OleDbCommand( "SELECT * FROM Abomodell", conn); OleDbDataReader results = cmd.ExecuteReader();

// Rückgabe des DataReaders an Control binden ActivityList.DataSource = results; ActivityList.DataBind(); conn.Close(); }</script></head><body> <asp:DataGrid id="ActivityList" runat="server"/></body></html>

Page 27: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

27

WebForms DatabindingBeispiel 5: QueryClient.aspx

Page 28: Softwareentwicklung mit .NET Teil 4 ADO.NET Dr. Ralph Zeller

28

Fragen?

Uff...