ADO.NET

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

ADO.NETist ein Teil der vonMicrosoftentwickelten.NET-Plattform. Es handelt sich um eine Sammlung vonKlassen,die den Zugriff aufrelationale Datenbankengewährleisten.

ADO.NET gilt als Nachfolger derActiveX Data Objects(ADO), hat aber nichts mit der ActiveX-Technologie zu tun. In der Tat ist es um zahlreiche Funktionen erweitert worden, so dass man von einer Neuentwicklung sprechen kann.

Aufgabe der Klassen (die sich imNamensraumSystem.Databefinden) ist die Datenbankanbindung und Datenhaltung im Arbeitsspeicher. Dazu existieren Klassen, die Verbindung zu einer Datenbank (Microsoft SQL Server,Oracleetc.) herstellen (sogenannteConnection-Klassen), Klassen, die Tabellen im Arbeitsspeicher repräsentieren, und es ermöglichen, mit ihnen zu arbeiten (sogenannteDataTables) und Klassen, die für gesamte Datenbanken im Arbeitsspeicher stehen (sogenannteDataSets).

Andere Klassen regeln die Anbindung an eine Datenbank. Für die Anbindung an die physische Datenbank existieren sogenannteDataProvider.Die Datenbanken können aufXML-Format abgebildet werden, weshalb es Klassen zum direkten Zugriff auf XML im NamensraumSystem.Xmlgibt.

Architektur von ADO.NET

[Bearbeiten|Quelltext bearbeiten]

Das Hauptanliegen von ADO.NET besteht darin, die Datenbeschaffung von der Bereitstellung und Anzeige der Daten vollständig zu trennen. Um dieses Ziel zu erreichen, spaltet sich ADO.NET in die drei HauptkomponentenDataSet,Datenproviderund die Klassen derDatenbindungauf. Letztere stellen allerdings keinen integralen Bestandteil von ADO.NET dar, stattdessen dienen sie der Anbindung der Steuerelemente an ein DataSet.

Aufbau des ADO.Net Datenproviders

Der Datenprovider ist die Schnittstelle zu einer Datenbank. Er muss fachliche Informationen über die Datenbank besitzen, d. h., er muss die Datenbank kennen. Für unterschiedliche Datenbanken existieren individuelle Datenprovider. Im.NET Framework sind die DatenproviderMicrosoft SQL ServerundOLE DBstandardmäßig enthalten. Auch für vieleOpen-Source-Datenbanken, wie z. B.MySQL,existieren.NET-Datenprovider.

Die vier Kernkomponenten der.NET-Datenprovider sind:

  • Connection:Stellt eine Verbindung her, die der Kommunikation mit einer Datenquelle dient. Seit.NET 2.0 ist es möglich, bei der Verbindung umfangreicheMetadatenzur Datenbank zu laden.
  • Command:Führt Anweisungen, gespeicherte Prozeduren und Aktionsabfragen aus. Dazu gehören unter anderemSELECT-,UPDATE- oderDELETE-Kommandos.
  • DataAdapter:Der DataAdapter füllt ein DataSet mit Daten und gleicht Aktualisierungen mit der Datenquelle ab. Er fungiert als Brücke zwischen der Datenquelle und einem DataSet-Objekt.
  • DataReader:Es handelt sich um einen vorwärtsgerichteten Datensatzleser, der nur einen lesenden Zugriff auf die Daten gestattet. Eine Navigation durch die Datensätze ist dabei nicht möglich, da diese sequentiell abgearbeitet werden.
Aufbau eines ADO.NET Datensets

Ein DataSet repräsentiert die speicherresidente,relationale Datenbankin der eigentlichen Anwendung. Es handelt sich dabei um ein Speicherabbild der eigentlichen Datenbank. Ein DataSet wird immer dann eingesetzt, wenn Daten mehrmals benötigt und von der Anwendung geändert werden. In diesem Fall werden die Daten über denDataAdapterim DataSet gespeichert, wo sie der Anwendung zur weiteren Verwendung zur Verfügung stehen.

Die wichtigsten Klassen des DataSet sind:

  • DataSet:Diese Klasse repräsentiert ein logischesSchema.Das Datenbankschema verwaltet Beziehungen zwischen den in der Klasse enthaltenen Tabellen und sorgt dafür, dass die Datenbank relational ist.
  • DataTable:Das DataTable-Objekt stellt eine Datenbanktabelle dar. Es handelt sich um einen Datenspeicher mit Datensätzen und Spalten.
  • DataRow:Die DataRow-Klasse repräsentiert einen konkreten Datensatz in einer DataTable. Eine DataRow-Instanz ist stets an ein DataTable-Objekt gebunden.
  • DataView:Dient zum Filtern (z. B.WHERE) und Sortieren (z. B.ORDER BY) von Daten in einer DataTable. Über eine DataView kann eine spezielle Sicht auf die Daten einer Tabelle angelegt werden.

In ADO.NET 1.x konnte zu bestimmten Zeitpunkten pro Verbindung nur ein Datenbankbefehl aktiv sein, beispielsweise einDataReaderlesend auf die Datenbank zugreifen. Versuche eines parallelen Zugriffs waren nicht möglich und führten zu Fehlermeldungen. Diese Architektur kann als Single Active Result Sets (SARS) bezeichnet werden.

ADO.NET 2.0 unterstützt hingegen Multiple Active Result Sets (MARS), also die Mehrfachverwendung einer Verbindung. MARS ist für denMicrosoft SQL Server2005 und 2008 verfügbar und dort im Standard deaktiviert.

Konfiguration der app.config bzw. web.config
<configuration>
<!-- Connection String für Verbindung zur Datenbank -->
<connectionStrings>
<addname="MyConnectionString"
providerName="System.Data.SqlClient"
connectionString="Data Source=(localdb)\v11; InitialCatalog=MyDatabaseName"/>
</connectionStrings>

<!-- Datenbank-Provider Factory -->
<!-- (meist in machine.config konfiguriert) -->
<system.data>
<DbProviderFactories>
<addname="SqlClient Data Provider"
invariant="System.Data.SqlClient"
description=".NET Framework Data Provider for SQL Server"
type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</DbProviderFactories>
</system.data>
</configuration>
Herstellen einer Datenbankverbindung
varsettings=ConfigurationManager.ConnectionStrings["MyConnectionString"];
varfactory=DbProviderFactories.GetFactory(settings.ProviderName);

using(varconnection=factory.CreateConnection())
{
if(connection==null)thrownewException("Could not create a connection.");
connection.ConnectionString=settings.ConnectionString;

// use DbParameters to prevent SQL Injections
varage=factory.CreateParameter();
if(age==null)thrownewException("Could not create parameter.");
age.ParameterName="@age";
age.Value=25;

// get a DbCommand with factory method
varcommand=connection.CreateCommand();
command.CommandText="SELECT * FROM dbo.People WHERE Age > @age";
command.CommandType=CommandType.Text;
command.Parameters.Add(age);

// open connection to database
awaitconnection.OpenAsync();

// Variant 1: read query results
vardataReader=awaitcommand.ExecuteReaderAsync();
while(awaitdataReader.ReadAsync())
{
Console.WriteLine("Id: '{0}', FirstName: '{1}', MiddleName: '{2}', LastName: '{3}'",
dataReader["id"],dataReader["firstname"],dataReader["middlename"],dataReader["lastname"]);
}
dataReader.Close();

// Variant 2: use a data adapter to fill a data table
using(vardataAdapter=factory.CreateDataAdapter())
{
if(dataAdapter==null)thrownewException("Could not create a data adapter.");
dataAdapter.SelectCommand=command;

vardataTable=newDataTable();
dataAdapter.FillSchema(dataTable,SchemaType.Source);// get table schema
dataAdapter.Fill(dataTable);// get data

using(vardataTableReader=newDataTableReader(dataTable))
{
while(awaitdataTableReader.ReadAsync())
{
Console.WriteLine("Id: '{0}', FirstName: '{1}', MiddleName: '{2}', LastName: '{3}'",
dataTableReader["id"],dataTableReader["firstname"],dataTableReader["middlename"],dataTableReader["lastname"]);
}
}
}
}