Zugriff auf Daten mit ADO.NET

ADO.NET ist eine der drei bewährten Methoden für den Zugriff auf Daten in .NET.

Abhängig vom Datenbankmanagementsystem, welches im Einsatz ist, wird der sogenannte ADO.NET-Datenanbieter ausgewählt. Dabei handelt es sich einfach um eine Bibliothek, welche Implementierungen für die unterscheidlichen Schnittstellen von ADO.NET bereitstellt.

Übersicht der relevanten ADO.NET-Datenanbieter
DBMS ADO.NET-Datenanbieter
Microsoft SQL Server Microsoft.Data.SqlClient
System.Data.SqlClient (veraltet)
SQLite Microsoft.Data.Sqlite
System.Data.Sqlite
MySQL MySqlConnector
MySQL Connector/NET MySql.Data
MariaDB MySqlConnector
PostgreSQL Npgsql

IDbConnection-Schnittstelle

Für den Aufbau einer Verbindung mit einer Datenquelle wird eine dem Datenanbieter entsprechendes DbConnection-Objekt erzeugt. Beim Erzeugen der Instanz wird ebenfalls die Verbindungszeichenfolge als Parameterwert übergeben. Durch die Objektmethode Open() wird die Verbindung dann geöffnet.

Wichtig ist alle nicht mehr notwendigen offenen Verbindungen zu schließen, sodass keine Resourcen vom Host der Datenquelle verschwendet werden. Zum Schließen der Verbindung kann die Instanzmethode Close() verwendet werden. Im unten aufgeführten Beispiel ist dies aber nicht notwendig, da der Garbage-Collector über das Schlüsselwort using angewiesen wird, das Verbindungsobjekt ordnungsgemäß zu schließen und den besetzten Speicher wieder frei zu geben.

C#
using IDbConnection connection = new SqlConnection(connectionString);
connection.Open();

IDbCommand-Schnittstelle

Der Zugriff auf Datenbankbefehle wird über eine Implementierung der IDbConnection-Schnittstelle realisiert. Das Verbindungsobjekt stellt in diesem Kontext eine CreateCommand()-Methode bereit, welche ein entsprechendes Befehlsobjekt zurückgibt. Der auszuführende SQL-Befehl wird dann der Eigenschaft CommandText zugewiesen.

Mehrere Execute-Methoden stehen bereit, um den gewünschten Befehl auszuführen. Die Methode ExecuteNonQuery() eignet sich bspw. hervorragend, um Datenelemente hinzuzufügen, zu aktualisieren oder zu entfernen.

C#
using IDbCommand command = connection.CreateCommand();
command.CommandText = sql;
command.ExecuteNonQuery();

IDataReader-Schnittstelle

Das Abrufen von Daten bzw. das Ausführen von SELECT-Anweisungen wird in der Regel über einen DataReader umgesetzt. Dabei werden die Daten per Stream bereitgestellt. Um einen solchen DataReader zu erhalten, wird die ExecuteReader()-Methode auf dem Befehlsobjekt ausgeführt.

Im Anschluss daran kann mit der Objektmethode Read() Eintrag für Eintrag durchgegangen werden.

Der DataRecord implementiert Get-Methoden für die jeweiligen Datentypen eines Werts. Über die allgemeine GetValue()-Methode wird der Wert einfach als object zurückgeliefert. Die Get-Methoden erwarten die Position des gewünschten Werts als nullbasierten Index übergeben zu bekommen. Soll dieser anhand vom Namen bestimmt werden, so stellt der DataRecord ebenfalls die Methode GetOrdinal() bereit, wobei der Name als Zeichenfolge übergeben wird. Gegenstück dazu ist die GetName()-Methode, welche den Namen anhand der angegebenen Position bestimmt.

C#
using IDbCommand command = connection.CreateCommand();
command.CommandText = sql;
using IDataReader reader = command.ExecuteReader();
while (reader.Read())
{
    string value = reader.GetString(reader.GetOrdinal("ColumnName"));
…
}

IDbDataParameter-Schnittstelle

Selbstverständlich sind mit ADO.NET auch parametrisierte Abfragen möglich. Dazu wird der gewünschte Parametername mit voranstehendem @ in dem auszuführenden SQL-Befehl angegeben.

Über die CreateParameter()-Methode vom Befehlsobjekt lassen sich die benötigten DataParameter instanzieren. Nachdem sowohl der Parametername ohne voranstehendes @ der Eigenschaft ParameterName als auch der zugehörige Wert der Value-Eigenschaft zugeordnet wurde, kann das Parameterobjekt der Parameters-Sammlung hinzugefügt werden.

Anschließend lässt sich der Befehl wie gewohnt ausführen.

C#
command.CommandText = "DELETE FROM MyTable WHERE MyTable.ID = @Id";
IDbDataParameter parameter = command.CreateParameter();
parameter.ParameterName = "Id";
parameter.Value = 0;
command.Parameters.Add(parameter);
command.ExecuteNonQuery();