Wie kann ich auf eine SQL Server Datenbank zugreifen?
Problem
Sie glauben, der Zugriff auf eine Datenbank sei kompliziert? Nun, in .NET muss das nicht so sein. In der Tat sind sogar nur wenige Klassen erforderlich.
Lösung
Für den Datenbankzugriff sind in .NET die folgenden fünf Klassen zuständig:
- SqlConnection: Stellt eine Verbindung zur Datenbank her.
- SqlCommand: Erlaubt die Ausführung von SQL Befehlen oder von Stored Procedures.
- SqlDataReader: Stellt einen FORWARD, READ ONLY Cursor zum Lesen von Daten dar.
- SqlTransaction: Stellt eine Transaktion dar
- SqlDataAdapter: Wird zum Befüllen eines DataSet und aktualisieren der Datenbank aus einem DataSet verwendet.
Das Präfix Sql deutet an, dass mit dieser Klasse nur auf den Microsoft SQL Server zugegriffen werden kann. In .NET werden aber auch Klassen für Oracle (Präfix Oracle), OLE DB (Präfix OleDb) und ODBC (Präfix Odbc) mitgeliefert. Alle Klassen bieten eine gemeinsame Schnittstelle an, erlauben aber auch technologiegebundene proprietäre Operationen.
Eine einfache Verwendung wird durch die folgende Konsolenanwendung illustriert, die alle Filme aus der AdventureWorks Cinema Datenbank lädt und den Namen und das Erscheinungsjahr eines jeden Films ausgibt
using System;
using System.Data.SqlClient;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string connStr = @"Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\AdventureWorks.Cinema.mdf;
Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Movies", conn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
string title = Convert.ToString(reader["Title"]);
string year = Convert.ToString(reader["Year"]);
Console.WriteLine("{0} ({1})", title, year);
}
}
}
}
}
}
}
Um die notwendigen Ressourcen für den Datenbankzugriff schnellstmöglich wieder freizugeben, wurden alle Verwendungen der Datenzugriffsklassen mit der C# using Anweisung eingerahmt. Diese garantiert, dass die Ressourcen auf jeden Fall nach Verlassen des Blockes freigegeben werden und nicht erst bei der Garbage Collection (was in der Regel erst einige Zeit später erfolgt).