Datenbanken sind immer ein zentrales Thema, aber als Einsteiger in das Thema hatte ich damals keinen guten Überblick, wie man das ganze mit .NET zum Laufen bekommt. Daher hier eine kleine “Einführung” zum Thema Datenbankverbindungen - Datenbank X mit .NET.
Heute: .NET und Microsoft SQL 2005
Das Testprojekt ist sehr sehr simpel gehalten - das Thema ADO.NET ist sehr groß, daher wollte ich nur auf primitivste Art und Weise zeigen, wie man sich zu einer DB verbinden und dort Aktionen ausführen kann. Typisierte Datasets oder O/R Mapper wie Linq to SQL oder Subsonic etc. können ebenfalls genutzt werdne. Insbesondere mit Linq werde ich mich auch noch zuwenden, aber vorher mal zu den “Basics” ;)
- Benötigte Software:
Die Datenbank-Software - SQL Server 2005 Express Edition - gibts hier zum Runderladen. Die Management Software - SQL Server Management Studio Express - gibts hier zum Runderladen. Visual Studio 2005 Express Edition gibts hier zum Runterladen.
- Test Datenbank erstellen:
Sobald unter den Windows Dienster der “SQL Server (SQLEXPRESS)” gestartet ist (nach der Installation ist dies standardmäßig automatisch der Fall), können wir über das SQL Management Studio Express unsere Testdatenbank anlegen.
Das anlegen einer Testdatenbank wurde ebenfalls bereits bei den Software Factories behandelt, sodass ich jetzt am Ende diese Testdatenbank habe:
- Konsolenprojekt erstellen
Wir erstellen einfach ein kleines Konsolenprojekt und wollen einfach ein paar Eintragungen vornehmen, ein Eintrag abändern, die Daten auslesen und wieder löschen. Das selbe werden wir zudem später mit Oracle und MySQL versuchen.
Im “Server Explorer” fügen wir unsere Datenbankverbindung hinzu:
Als Datenquelle geben wir “Microsoft SQL Server” an und als Datenanbieter “.NET Framework-Datenanbieter für SQL”:
Sobald man sich mit der jeweiligen Datenbank verbunden hat, sieht man in den Eigenschaften den “ConnectionString”:
Ansonsten brauchen wir diese Verbindung im VS eigentlich nicht. Es gibt aber Steuerelemente die darauf zugreifen können - in unserem sehr einfachen Beispiel benötigen wir das aber nicht.
Eine gute Auflistung von den ConnectionsStrings und ihrer Zusammensetzungen findet man hier: www.connectionsstrings.com
Die Demoanwendung ist sehr einfach und kann weiter unten runtergeladen werden.
Teil 1: DB Verbindung öffnen
Über die Klasse “SqlConnection” öffnen wir eine Verbindung zur Datenbank. Achtung: Die DB Verbindung sollte unbedingt wieder am Ende geschlossen werden - man kann dies auch über das “using-Statement” erreichen
SqlConnection connection = new SqlConnection(@"Data Source=REMAN-NOTEBOOK\SQLEXPRESS;Initial Catalog=Test;Integrated Security=True"); connection.Open();
Teil 2: Werte in die DB schreiben
Einen SQL Befehl an die DB schicken geht ganz einfach über die Klasse “SqlCommand”, wo wir noch unsere Verbindung als Parameter mitgeben und diese Ausführen. Der Rückgabewerte entspricht der Anzahl an Zeilen, welche durch den SqlBefehl angepasst werden mussten.
SqlCommand insertCommand = new SqlCommand("INSERT INTO [Test].[dbo].[Test] ([value]) VALUES ('Test')", connection); int i = insertCommand.ExecuteNonQuery();
Teil 3: Daten aus der Datenbank holen
Um auf die Werte aus der Datenbank zuzugreifen wird es ein klein wenig komplizierter. Unser SqlCommand (Select * From…) wird einem SqlDataAdapter übergeben, welcher eine DataTable füllt. Diese DataTable enthält dann unsere gesamte Tabelle samt den Werten. Eine andere Vorgehensweise ist sicherlich auch möglich (Datasets/typisierte Datasets…) wurde hier aber aus den oben genannten Gründen nicht gemacht.
SqlCommand readCommand = new SqlCommand("SELECT * FROM [Test].[dbo].[Test]", connection); SqlDataAdapter adapter = new SqlDataAdapter(readCommand); DataTable datatable = new DataTable(); adapter.Fill(datatable); for (int x = 0; x < datatable.Rows.Count; x++) { object[] values = datatable.Rows[x].ItemArray; }
In values[0] sind die Werte enthalten die in der Spalte “ID” stehen und in values[1] die in der Spalte “values”. Diese kann man nun in andere Objekte casten usw.
Teil 4: Daten aus der Datenbank ändern
Entspricht der Vorgehensweise wie beim Werteschreiben, nur halt mit einem anderen Sql Befehl:
SqlCommand updateCommand = new SqlCommand("UPDATE [Test].[dbo].[Test] SET value = 'UpdatedTest'", connection); int updatedReturnValue = updateCommand.ExecuteNonQuery();
Teil 5: Daten aus der Datenbank löschen
Ebenfalls so wie oben beschrieben:
SqlCommand deleteCommand = new SqlCommand("DELETE FROM [Test].[dbo].[Test]", connection); int deleteReturnValue = deleteCommand.ExecuteNonQuery();
Abschließende Bemerkung
In der praxis würde ich eher typisierte Datasets oder andere O/R Mapper einsetzen. Die Software Factories (siehe Service Factory)bringen zudem ebenfalls einen “O/R” Mapper mit, welcher “zusammen klickbar” ist und daher die lästige Schreibarbeit für die CRUD Befehle erspart. LINQ to SQL oder Subsonic gehen ebenfalls in die Richtung O/R Mapper und sind ebenfalls sehr interessant, sodass dieser Post nur mal die “basics” vermitteln sollte.
Achtung: Zum Ausführen des Democodes muss natürlich der ConnectionString und die DB so erstellt sein, wie oben beschrieben. Auserdem sollte Visual Studio im Administrator-Modus laufen, ansonsten gibts leider einen Fehler.