Wird eine Anweisung "using" um einen DataReader gesetzt, um sie zu schließen?
Schreibe ich normalerweise meinen DataReader
code wie folgt:
try
{
dr = cmd.ExecuteReader(CommandBehavior.SingleResult);
while (dr.Read())
{
//Do stuff
}
}
finally
{
if (dr != null) { dr.Close(); }
}
Ist es sicher zu ersetzen, die try
und finally
mit nur einem using
- block, um die DataReader
's Schöpfung? Der Grund warum ich Frage ist, weil in allen die Microsoft-Beispiele, die ich gesehen habe verwenden Sie eine mit für die-Verbindung aber immer explizit aufrufen Close()
auf die DataReader
.
Heres ein Beispiel aus
Abrufen von Daten Mit einem DataReader (ADO.NET):
static void HasRows(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}
Kommentar zu dem Problem
Als seitliche Anmerkung, die meisten der MS-Beispiele, die ich gesehen habe, sind entweder zu kompliziert oder nicht wirklich nutzen viel von der Sprache verfügbaren Funktionen. Teilweise ist es, weil Sie einfach Rollen Sie den Beispiel-code aus früheren Versionen und wirklich nur schauen, dass es immer noch läuft. Meine Vermutung ist, dass dieser code nicht gepflegt ist, durch deren hellste, da der code ist nie clever oder effizient.
@NotMe von der Qualität der Beispiel code, ich habe Verdacht auf für die Jahre , geschrieben und verwaltet von entry-level-Praktikanten, nicht die Menschen, die tatsächlich entwickelt, die die Klassen in den ersten Platz. Es ist Dinge wie Microsofts glanzlos .NET-Dokumentation, die Art freue ich mich schon auf SO die neue Dokumentation-Erweiterung.
Möglich, Duplikat der Ist es notwendig, manuell zu schließen und zu entsorgen SqlDataReader?
@Cupcake nicht ein dupe meiner Meinung nach. Dieser hier fragt, ob eine
- block wird geschlossen, ein Daten-Leser, der andere fragt, ob es erforderlich ist, um es zu schließen. Nicht die gleiche Sache. @ShadowWizard das ist ein guter Punkt.
InformationsquelleAutor der Frage user169867 | 2010-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja.
using
Anrufe Entsorgen. Der Aufruf von Dispose auf SqlDataReader schließt.Dies ist Pseudo-code des SqlDataReader er aus Reflektor:
InformationsquelleAutor der Antwort Greg
Normalerweise
using()
AnrufeDispose()
und die Aufrufeclose()
wiederum.Im Falle eines DataReader, der in der Nähe ist aufgerufen, nur wenn
CommandBehavior.CloseConnection
eingestellt ist (siehe Kommentare von diesem Artikel http://weblogs.asp.net/joseguay/archive/2008/07/22/ensure-proper-closure-amp-disposal-of-a-datareader.aspx).EDIT: Dieser Artikel sagt etwas Interessantes:
InformationsquelleAutor der Antwort naivists
Im Gegensatz zum Beispiel hier, meine Praxis hat sich die Verwendung eines using-Blocks für die Verbindung, den Befehl und den reader. Beachten Sie, dass Sie können Stapel verschachtelte Blöcke tiefer der Einzug Kosten.
InformationsquelleAutor der Antwort Tevya
Aus, was ich mich erinnern kann, wenn eine Ausnahme Auftritt, in einem Using-block, dann die Dispose-Methode für das Objekt aufgerufen. Normalerweise habe ich eine Using-Anweisung für alle Einweg-Objekte, ohne einen Try..Catch.
EDIT: Vergaß zu sagen, dass für einige Objekte, die den Aufruf von Dispose wird wiederum in der Nähe nennen, für das Objekt.
InformationsquelleAutor der Antwort Jason Evans