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.