Première question:
dis que j'ai
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();
}
La connexion est-elle fermée? Parce que techniquement, nous n'arrivons jamais au dernier }
comme return
avant.
Deuxième question:
Cette fois, j'ai:
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*/ }
Maintenant, disons quelque part dans le try
nous obtenons une erreur et elle est interceptée. La connexion est-elle toujours fermée? Car encore une fois, nous sautons le reste du code dans le try
et passons directement à l' catch
instruction.
Est-ce que je pense trop linéairement à la façon dont using
fonctionne? c'est-à-dire est Dispose()
simplement appelé lorsque nous quittons la using
portée?
la source
try catch
dans le,using
vous pouvez explicitement.Commit
ou des.Rollback
transactions dans lecatch
. Ceci est à la fois plus lisible et explicite, et vous permet de valider si cela a du sens étant donné le type de l'exception. (Les transactions sont implicitement annuléesconn.Close
si elles ne sont pas validées.).Open
la connexion.using
garantit seulement que laDispose
méthode de l'objet est appelée.Oui aux deux questions. L'instruction using est compilée dans un bloc try / finally
est le même que
Edit: Correction de la distribution en jetable http://msdn.microsoft.com/en-us/library/yh598w02.aspx
la source
Voici mon modèle. Tout ce dont vous avez besoin pour sélectionner des données à partir d'un serveur SQL. La connexion est fermée et supprimée et les erreurs de connexion et d'exécution sont interceptées.
* Révisé: 2015-11-09 *
Tel que suggéré par NickG; Si trop d'accolades vous ennuient, formatez comme ça ...
Là encore, si vous travaillez pour des jeux EA ou DayBreak, vous pouvez également renoncer aux sauts de ligne, car ceux-ci sont réservés aux personnes qui doivent revenir et regarder votre code plus tard et qui s'en soucient vraiment? Ai-je raison? Je veux dire 1 ligne au lieu de 23 signifie que je suis un meilleur programmeur, non?
Ouf ... OK. J'ai sorti ça de mon système et j'ai fini de m'amuser pendant un moment. Continuer.
la source
conn.Close();
à la fin? Lausing
déclaration ne fait- elle pas cela pour vous via l'élimination?Dispose est simplement appelé lorsque vous quittez le champ d'utilisation. L'intention de «l'utilisation» est de donner aux développeurs un moyen garanti de s'assurer que les ressources sont éliminées.
Depuis MSDN :
la source
Using
génère un essai / enfin autour de l'objet alloué et appelleDispose()
pour vous.Cela vous évite d'avoir à créer manuellement le bloc try / finally et à appeler
Dispose()
la source
Dans votre premier exemple, le compilateur C # traduira en fait l'instruction using en ce qui suit:
Enfin, les instructions seront toujours appelées avant le retour d'une fonction et ainsi la connexion sera toujours fermée / supprimée.
Ainsi, dans votre deuxième exemple, le code sera compilé comme suit:
L'exception sera interceptée dans l'instruction finally et la connexion sera fermée. L'exception ne sera pas vue par la clause catch externe.
la source
J'ai écrit deux instructions using dans un bloc try / catch et je pouvais voir que l'exception était interceptée de la même manière si elle était placée dans l' instruction using interne , comme dans l' exemple ShaneLS .
Peu importe où est placé le try / catch , l'exception sera interceptée sans problème.
la source