myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Knowledge Base » Artikel » [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
.Kai .Kai ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1836.gif


Dabei seit: 01.02.2005
Beiträge: 1.130


.Kai ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.


mycsharp.de  Moderationshinweis von Abt (09.04.2013 15:37):

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



Dateianhang:
pdf Ressourcen_schonen.pdf (364,50 KB, 2.588 mal heruntergeladen)
19.07.2006 23:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
marsgk marsgk ist männlich
myCSharp.de-Mitglied

Dabei seit: 04.06.2005
Beiträge: 1.439
Entwicklungsumgebung: Notepad++ + csc + nmake
Herkunft: Linz, Austria


marsgk ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
DBConnection con = null;
try {
    con = new DBConnection();
    ...
} finally {
   if (con != null) con.Close();
}
19.07.2006 23:29 Beiträge des Benutzers | zu Buddylist hinzufügen
Franknstein Franknstein ist männlich
myCSharp.de-Mitglied

Dabei seit: 27.11.2003
Beiträge: 530
Entwicklungsumgebung: VCSharp 2005


Franknstein ist offline Füge Franknstein Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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... großes Grinsen

Aber sonst ist das meines Wissens alles richtig.


--
mfg
Franknstein
19.07.2006 23:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
.Kai .Kai ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1836.gif


Dabei seit: 01.02.2005
Beiträge: 1.130

Themenstarter Thema begonnen von .Kai

.Kai ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

oki, danke für die Korrekturen. Hab die entsprechenden Stellen verbessert.
19.07.2006 23:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
.Kai .Kai ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1836.gif


Dabei seit: 01.02.2005
Beiträge: 1.130

Themenstarter Thema begonnen von .Kai

.Kai ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
19.07.2006 23:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lord Hessia Lord Hessia ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.05.2006
Beiträge: 497
Entwicklungsumgebung: #Develop, Eclipse
Herkunft: Gießener Umland


Lord Hessia ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Bzgl. Performance von Exceptions siehe auch:  try/catch
20.07.2006 00:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LastGentleman LastGentleman ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1696.jpg


Dabei seit: 13.03.2005
Beiträge: 1.273
Entwicklungsumgebung: VS 2012 Pro, MS Access
Herkunft: Österreich


LastGentleman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
20.07.2006 07:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate.
schaedld schaedld ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-2533.jpg


Dabei seit: 05.04.2006
Beiträge: 1.433
Entwicklungsumgebung: Visual Studio 2008 / 2010
Herkunft: Schweiz


schaedld ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Gratulation zum Artikel. Wirklich kurz und gut sowie leicht verständlich.
11.10.2006 07:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
.Kai .Kai ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1836.gif


Dabei seit: 01.02.2005
Beiträge: 1.130

Themenstarter Thema begonnen von .Kai

.Kai ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habe mal den Diskussionteil abgetrennt, bitte im Thread  Datenbanken richtig öffnen und schließen fortsetzen.
11.10.2006 08:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.058


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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.
11.10.2006 09:12 Beiträge des Benutzers | zu Buddylist hinzufügen
.Kai .Kai ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1836.gif


Dabei seit: 01.02.2005
Beiträge: 1.130

Themenstarter Thema begonnen von .Kai

.Kai ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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.
11.10.2006 09:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Robert G Robert G ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1907.png


Dabei seit: 12.04.2006
Beiträge: 347
Entwicklungsumgebung: VS05 (Chrome/C#);TurboDel phi
Herkunft: München


Robert G ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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:

C#-Code:
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. Augenzwinkern
11.10.2006 12:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Jahre.
Der letzte Beitrag ist älter als 8 Jahre.
Antwort erstellen


© Copyright 2003-2014 myCSharp.de-Team. Alle Rechte vorbehalten. 19.12.2014 23:38