Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
.Kai
myCSharp.de - Member

Avatar #avatar-1836.gif


Dabei seit:
Beiträge: 1184

Themenstarter:

[Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

beantworten | zitieren | melden

Hallo zusammen,

ich habe mich mal hingesetzt und versucht einen kleinen Artikel über den Verbindungsaufbau zu Datenbanken zu schreiben.

Feedback und Verbesserungsvorschläge sind ausdrücklich erwünscht.

Den Artikel gibt es als Dateianhang am Ende dieses Beitrags oder unter der Adresse:
http://www.veloursnebel.de/Artikel/Ressourcen_schonen.pdf

Vielen Dank an Xqgene, der ein wenig Korrektur gelesen hat.
Attachments

Moderationshinweis von Abt (09.04.2013 - 15:37:36):

Das PDF ist nicht mehr über die URL, sondern nur noch im Anhang verfügbar.

private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1443
Herkunft: Linz, Austria

beantworten | zitieren | melden

Du musst die Exceptions ja nicht unbedingt fangen. Du kannst auch folgenden Code verwenden:


DBConnection con = null;
try {
    con = new DBConnection();
    ...
} finally {
   if (con != null) con.Close();
}
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 531

beantworten | zitieren | melden

Nur ein kleiner Punkt:
Exceptions sollten besser direkt am Entstehungsort behandelt werden. Exceptions fressen nämlich Ressourcen wie verrückt. Nimm als Begründung für das Using, dass man nicht das Dispose im Finally vergessen kann oder der wichtige Code nicht so weit auseinandergezogen wird...

Aber sonst ist das meines Wissens alles richtig.


--
mfg
Franknstein
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
.Kai
myCSharp.de - Member

Avatar #avatar-1836.gif


Dabei seit:
Beiträge: 1184

Themenstarter:

beantworten | zitieren | melden

oki, danke für die Korrekturen. Hab die entsprechenden Stellen verbessert.
private Nachricht | Beiträge des Benutzers
.Kai
myCSharp.de - Member

Avatar #avatar-1836.gif


Dabei seit:
Beiträge: 1184

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von marsgk
Du musst die Exceptions ja nicht unbedingt fangen. Du kannst auch folgenden Code verwenden:

Du hast natürlich Recht. Hab diese Methode ganz außer acht gelassen.
private Nachricht | Beiträge des Benutzers
Lord Hessia
myCSharp.de - Member



Dabei seit:
Beiträge: 497
Herkunft: Gießener Umland

beantworten | zitieren | melden

Bzgl. Performance von Exceptions siehe auch: try/catch
Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.
private Nachricht | Beiträge des Benutzers
LastGentleman
myCSharp.de - Member

Avatar #avatar-1696.jpg


Dabei seit:
Beiträge: 1274
Herkunft: Österreich

beantworten | zitieren | melden

Danke für deine Mühe diesen Artikel zu schreiben. Mir läuft es jedesmal schauderhaft über den Rücken wenn ich Beispiele sehe die beim Datenbankzugriff kein Using verwenden. Buaaa.

Auch der Link von Lord Hessia ist sehr interessant, ich hab auch immer geglaubt das Execeptions fürchterlich lange sind.
"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1436
Herkunft: Schweiz

beantworten | zitieren | melden

Gratulation zum Artikel. Wirklich kurz und gut sowie leicht verständlich.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
private Nachricht | Beiträge des Benutzers
.Kai
myCSharp.de - Member

Avatar #avatar-1836.gif


Dabei seit:
Beiträge: 1184

Themenstarter:

beantworten | zitieren | melden

Ich habe mal den Diskussionteil abgetrennt, bitte im Thread Datenbanken richtig öffnen und schließen fortsetzen.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10076

beantworten | zitieren | melden

Eine kleine Verbesserung des Textes:

Du schreibst, das Du per "Scope" den Quelltext übersichtlicher und ausserdem
die Verbindung schliesst.
Das ist Falsch.

In deinem Beispiel benutzt Du "Using" und das ist der Grund für das schliessen.
Using ist eine Abkürzung für folgende Schreibweise:


ODBCConnection con = new ODBCConnection(...);
try
{
....
}
finally
{
  con.Dispose();
}

Using macht in einem Finally Block immer ein Dispose, weshalb die Klasse
die Instantiiert werden soll IDisposable implementieren muss.
private Nachricht | Beiträge des Benutzers
.Kai
myCSharp.de - Member

Avatar #avatar-1836.gif


Dabei seit:
Beiträge: 1184

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von FZelle
Eine kleine Verbesserung des Textes:

Du schreibst, das Du per "Scope" den Quelltext übersichtlicher und ausserdem
die Verbindung schliesst.
Das ist Falsch.

In deinem Beispiel benutzt Du "Using" und das ist der Grund für das schliessen.
Using ist eine Abkürzung für folgende Schreibweise:


ODBCConnection con = new ODBCConnection(...);
try
{
....
}
finally
{
  con.Dispose();
}

Using macht in einem Finally Block immer ein Dispose, weshalb die Klasse
die Instantiiert werden soll IDisposable implementieren muss.

Korrekt! Ist im Text nicht genau genug formuliert.

Das using im IL in ein Try-Catch Konstrukt übersetzt wird, hatte ich allerdings geschrieben.
Ich überarbeite den Artikel bei Gelegenheit und korrigiere die entsprechenden Stellen.

Vielen Dank für den Hinweis.
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 348
Herkunft: München

beantworten | zitieren | melden

Zitat
Original von .Kai
Korrekt! Ist im Text nicht genau genug formuliert.

Das using im IL in ein Try-Catch Konstrukt übersetzt wird, hatte ich allerdings geschrieben.
Ich überarbeite den Artikel bei Gelegenheit und korrigiere die entsprechenden Stellen.
Hat nichts mit "genau genug formuliert" zu tun.
Es ist der "finally"-block, der zählt, nicht "Catch".
Außerdem sollte das hier:

using (OdbcConnection sqlConn = new OdbcConnection()
{
  OdbcCommand sqlCmd = new OdbcCommand(sql, sqlConn);
  sqlConn.Open();
  OdbcDataReader sqlReader = sqlCmd.ExecuteReader();
  while (sqlReader.Read())
  {
    Console.WriteLine(sqlReader["ID"]);
  }
  sqlReader.Close();
  sqlConn.Close();
}
So aussehen:

using (OdbcConnection sqlConn = new OdbcConnection())
using (OdbcCommand sqlCmd = sqlConn.CreateCommand())
{
  sqlCmd.CommandText = sql;
  sqlConn.Open();
  using(OdbcDataReader sqlReader = sqlCmd.ExecuteReader())
  {
    while (sqlReader.Read())
    {
      Console.WriteLine(sqlReader["ID"]);
    }
  }
}
Auf die Art verhinderst du, dass nervige Finalizer ausgeführt werden.
Connection.Close in einem using-Block aufzurufen macht auch keinen Sinn, das erledigt Dispose schon.
Und den Indexer eines DataReaders sollte man IMHO auch nicht wirklich benutzen, sondern die typisierten Methoden, die den Wert mit dem richtigen Typ aus dem DB cursor ziehen.
Zitat
Mit Hilfe dieser kleinen Änderung am Code kann man nun davon ausgehen, daß die Verbindung zur Datenbank immer geschlossen wird.
Die Verbindung wird immer geschlossen. Das erledigt der Finalizer der Connection. Man benutzt using nicht um zu verhindern dass die Verbindung offen bleibt, sondern um zu verhindern dass Finalizer ausgeführt werden und damit man weiß wann die Verbindung geschlossen wird.
private Nachricht | Beiträge des Benutzers