Erste Frage:
Sag ich habe
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string storedProc = "GetData";
SqlCommand command = new SqlCommand(storedProc, connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
return (byte[])command.ExecuteScalar();
}
Wird die Verbindung geschlossen? Denn technisch kommen wir nie so zum letzten }
wie return
vorher.
Zweite Frage:
Diesmal habe ich:
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
int employeeID = findEmployeeID();
connection.Open();
SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
command.CommandTimeout = 5;
command.ExecuteNonQuery();
}
}
catch (Exception) { /*Handle error*/ }
Sagen try
wir jetzt irgendwo in der wir bekommen einen Fehler und es wird gefangen. Wird die Verbindung immer noch geschlossen? Denn wieder überspringen wir den Rest des Codes in der try
und gehen direkt zur catch
Anweisung.
Denke ich zu linear darüber, wie es using
funktioniert? dh Wird Dispose()
einfach angerufen, wenn wir den using
Bereich verlassen ?
quelle
try catch
innerhalb derusing
Sie explizit.Commit
oder.Rollback
Transaktionen in dercatch
. Dies ist sowohl lesbarer als auch expliziter und ermöglicht Ihnen das Festschreiben, wenn dies angesichts des Ausnahmetyps sinnvoll ist. (Transaktionen werden implizit zurückgesetzt,conn.Close
wenn sie nicht festgeschrieben wurden.)Open
die Verbindung herstellen.using
garantiert nur, dass dieDispose
Methode des Objekts aufgerufen wird.Ja zu beiden Fragen. Die using-Anweisung wird zu einem try / finally-Block kompiliert
ist das gleiche wie
Bearbeiten: Korrektur der Besetzung auf Einweg http://msdn.microsoft.com/en-us/library/yh598w02.aspx
quelle
Hier ist meine Vorlage. Alles, was Sie zum Auswählen von Daten von einem SQL Server benötigen. Die Verbindung wird geschlossen und entsorgt, und Fehler bei der Verbindung und Ausführung werden abgefangen.
* Überarbeitet: 09.11.2015 *
Wie von NickG vorgeschlagen; Wenn Sie zu viele Zahnspangen stören, formatieren Sie wie folgt ...
Wenn Sie für EA- oder DayBreak-Spiele arbeiten, können Sie auch auf Zeilenumbrüche verzichten, da diese nur für Leute gedacht sind, die später zurückkommen und sich Ihren Code ansehen müssen und wen interessiert das wirklich? Habe ich recht? Ich meine 1 Zeile statt 23 bedeutet, dass ich ein besserer Programmierer bin, oder?
Puh ... OK. Ich habe das aus meinem System herausgeholt und bin damit fertig, mich für eine Weile zu amüsieren. Mach weiter.
quelle
conn.Close();
am Ende? Tut dieusing
Aussage das nicht für Sie durch Entsorgung?Dispose wird einfach aufgerufen, wenn Sie den Anwendungsbereich verlassen. Die Absicht der "Verwendung" besteht darin, Entwicklern eine garantierte Möglichkeit zu bieten, um sicherzustellen, dass Ressourcen entsorgt werden.
Von MSDN :
quelle
Using
generiert einen try / finally-Vorgang für das zugewiesene Objekt und ruftDispose()
nach Ihnen.Dies erspart Ihnen den Aufwand, den try / finally-Block manuell zu erstellen und aufzurufen
Dispose()
quelle
In Ihrem ersten Beispiel übersetzt der C # -Compiler die using-Anweisung tatsächlich in Folgendes:
Schließlich werden Anweisungen immer aufgerufen, bevor eine Funktion zurückkehrt, und die Verbindung wird immer geschlossen / entsorgt.
In Ihrem zweiten Beispiel wird der Code also wie folgt kompiliert:
Die Ausnahme wird in der finally-Anweisung abgefangen und die Verbindung geschlossen. Die Ausnahme wird von der äußeren catch-Klausel nicht gesehen.
quelle
Ich habe zwei using- Anweisungen in einen try / catch- Block geschrieben und konnte sehen, dass die Ausnahme auf die gleiche Weise abgefangen wurde, wenn sie genau wie das ShaneLS- Beispiel in die innere using- Anweisung eingefügt wurde .
Unabhängig davon, wo der Versuch / Fang platziert ist, wird die Ausnahme ohne Probleme abgefangen.
quelle