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

  1.  using System.Data.SqlClient;

Hier die Bekanntgabe des Namespace.


Verbindungsobjekt der Klasse SqlConnection wird erzeugt

  1.  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:

  1.  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

  1.  con.Open();



EIn SQL-Befehl formuliert

  1.  String str = "SELECT * FROM tblPerson";


Der SQL-Befehl abgesetzt
  1.  SqlCommand cmd = new SqlCommand(str, con);


Eventuell ein Ergebnis verarbeitet

  1.  SqlDataAdapter sda = new SqlDataAdapter(cmd);
  2.  DataSet ds = new DataSet();
  3.  sda.Fill(ds, "tblPerson");
  4.  
  5.  foreach (DataRow dr in ds.Tables["tblPerson"].Rows)
  6.      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

  1.  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.

Beispielprogramm zur Datenbankanbindung


  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4.  
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8.  
  9. namespace dbDemo
  10. {
  11.     class Program
  12.     {
  13.         static void Main(string[] args)
  14.         {
  15.             SqlConnection con = new SqlConnection("Server=(localdb)\\Projects;Integrated Security=true;");
  16.             String str = "IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'MyDatabase') CREATE DATABASE MyDatabase";
  17.             SqlCommand cmd = new SqlCommand(str, con);
  18.             try
  19.             {
  20.                 con.Open();
  21.                 cmd.ExecuteNonQuery();
  22.             }
  23.             catch (SystemException ex)
  24.             {
  25.                 Console.WriteLine(ex.ToString());
  26.             }
  27.             finally
  28.             {
  29.                 if (con.State == ConnectionState.Open)
  30.                     con.Close();
  31.             }
  32.             Console.WriteLine("db created");
  33.  
  34.  
  35.             execNonQuery("IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'tblPerson') DROP TABLE tblPerson");
  36.             execNonQuery("CREATE TABLE tblPerson" +
  37.                 "(personId INTEGER PRIMARY KEY," +
  38.                 "name CHAR(50), adress CHAR(255))");
  39.             Console.WriteLine("table created");
  40.  
  41.             execNonQuery("INSERT INTO tblPerson(personId, name, adress) " +
  42.                 "VALUES (1, 'Max Mustermann', 'Beispieladresse')");
  43.             Console.WriteLine("table filled");
  44.  
  45.             con = new SqlConnection("Server=(localdb)\\Projects;Integrated Security=true; database=MyDatabase");
  46.             str = "SELECT * FROM tblPerson";
  47.             cmd = new SqlCommand(str, con);
  48.  
  49.             SqlDataAdapter sda = new SqlDataAdapter(cmd);
  50.             DataSet ds = new DataSet();
  51.             sda.Fill(ds, "tblPerson");
  52.  
  53.             foreach (DataRow dr in ds.Tables["tblPerson"].Rows)
  54.                 Console.WriteLine("{0}\t{1}", dr["personId"], dr["name"]);
  55.  
  56.             Console.Read();
  57.         }
  58.  
  59.         static private void execNonQuery(String str)
  60.         {
  61.             SqlConnection con = new SqlConnection("Server=(localdb)\\Projects;Integrated Security=true; database=MyDatabase");
  62.             SqlCommand cmd = new SqlCommand(str, con);
  63.             try
  64.             {
  65.                 con.Open();
  66.                 cmd.ExecuteNonQuery();
  67.             }
  68.             catch (SystemException ex)
  69.             {
  70.                 Console.WriteLine(ex.ToString());
  71.             }
  72.             finally
  73.             {
  74.                 if (con.State == ConnectionState.Open)
  75.                     con.Close();
  76.             }
  77.         }
  78.     }
  79. }


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.


Last modified: Friday, 24 August 2018, 1:01 PM