Datenbankanbindung
Eine besondere Herausforderung stellt häufig das Herstellen einer Verbindung zu einer Datenbank aus einer Programmiersprache dar. Das Prinzip ist immer gleich:
- Auswahl und Einbindung einer auf eine Bibliothek mit SQL-Client-Funktionalität (Datenprovider)
- Öffnen der Verbindung mit Name des DB-Servers (Host), Authentifizierung des Benutzers, Name der Datenbank
- Ausführung der SQL-Abfragen bzw. -Anweisungen
- Schließen der Verbindung
Hier wird beispielhaft die Verbindung aus einer C#-Anwendung zu einer Microsoft-Datenbank demonstriert:
Eine gute Wahl ist hier der SqlClient-Datenprovider, für die Verbindung mit MS-SQL-Server oder localdb
- using System.Data.SqlClient;
Hier die Bekanntgabe des Namespace.
Verbindungsobjekt der Klasse SqlConnection wird erzeugt
- SqlConnection con = new SqlConnection("Server=(localdb)\\Projects;Integrated Security=true; database=MyDatabase");
Dabei enthält der
ConnectionString alle notwendigen Informationen (mit Semikolon
separiert). Hier ist eine Authentifizierung nicht nötig, weil wir uns
nur mit localdb verbinden. Diese ist allerdings für die Authentifizierung an einem realen SQL-Server nötig:
- SqlConnection con = new SqlConnection(@"Data Source=WAP-SQL2-002;Initial Catalog=UebVerleger;Integrated Security=False;User ID=dbUeb;Password=dbsql;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False");
Danach wird die Verbindung geöffnet
- con.Open();
EIn SQL-Befehl formuliert
- String str = "SELECT * FROM tblPerson";
Der SQL-Befehl abgesetzt
- SqlCommand cmd = new SqlCommand(str, con);
Eventuell ein Ergebnis verarbeitet
- SqlDataAdapter sda = new SqlDataAdapter(cmd);
- DataSet ds = new DataSet();
- sda.Fill(ds, "tblPerson");
- foreach (DataRow dr in ds.Tables["tblPerson"].Rows)
- Console.WriteLine("{0}\t{1}", dr["personId"], dr["name"]);
Falls nun keine weiteren SQL-Befehle ausgeführt werden müssen, wird die DB-Verbindung wieder geschlossen
- con.Close();
Zwar werden nämlich die Ressourcen auf der Client-Seite durch den Garbage Collector auch so nach dem Verlassen des Gültigkeitsbereichs wieder freigegeben, aber ohne explizites Schließen würde der Server nicht davon erfahren und damit seine für die Verbindung bereitgestellten Ressourcen weiterhin bereithalten.
Programmbeispiel
Im folgenden Beispielprogramm sind alle wichtigen Funktionalitäten enthalten:
Zuerst muss mit dem Objektexplorer localdb verbunden werden.

- using System;
- using System.Data;
- using System.Data.SqlClient;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace dbDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- SqlConnection con = new SqlConnection("Server=(localdb)\\Projects;Integrated Security=true;");
- String str = "IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'MyDatabase') CREATE DATABASE MyDatabase";
- SqlCommand cmd = new SqlCommand(str, con);
- try
- {
- con.Open();
- cmd.ExecuteNonQuery();
- }
- catch (SystemException ex)
- {
- Console.WriteLine(ex.ToString());
- }
- finally
- {
- if (con.State == ConnectionState.Open)
- con.Close();
- }
- Console.WriteLine("db created");
- execNonQuery("IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'tblPerson') DROP TABLE tblPerson");
- execNonQuery("CREATE TABLE tblPerson" +
- "(personId INTEGER PRIMARY KEY," +
- "name CHAR(50), adress CHAR(255))");
- Console.WriteLine("table created");
- execNonQuery("INSERT INTO tblPerson(personId, name, adress) " +
- "VALUES (1, 'Max Mustermann', 'Beispieladresse')");
- Console.WriteLine("table filled");
- con = new SqlConnection("Server=(localdb)\\Projects;Integrated Security=true; database=MyDatabase");
- str = "SELECT * FROM tblPerson";
- cmd = new SqlCommand(str, con);
- SqlDataAdapter sda = new SqlDataAdapter(cmd);
- DataSet ds = new DataSet();
- sda.Fill(ds, "tblPerson");
- foreach (DataRow dr in ds.Tables["tblPerson"].Rows)
- Console.WriteLine("{0}\t{1}", dr["personId"], dr["name"]);
- Console.Read();
- }
- static private void execNonQuery(String str)
- {
- SqlConnection con = new SqlConnection("Server=(localdb)\\Projects;Integrated Security=true; database=MyDatabase");
- SqlCommand cmd = new SqlCommand(str, con);
- try
- {
- con.Open();
- cmd.ExecuteNonQuery();
- }
- catch (SystemException ex)
- {
- Console.WriteLine(ex.ToString());
- }
- finally
- {
- if (con.State == ConnectionState.Open)
- con.Close();
- }
- }
- }
- }
Da bei DB-Verbindungen auch z.B. die Netzwerkverbindung gestört sein könnte oder andere Dinge schiefgehen können, müssen die Exceptions, die bei diesen Aktionen geworfen werden können, entsprechend behandelt werden.