Puis-je utiliser cette approche efficacement?
using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionSsortingng)) { cmd.Connection.Open(); // set up parameters and CommandType to StoredProcedure etc. etc. cmd.ExecuteNonQuery(); }
Mon souci est le suivant: la méthode Dispose de SqlCommand (appelée lors de la sortie du bloc using) ferme-t-elle ou non l’object SqlConnection sous-jacent?
Non, l’élimination de SqlCommand
pas la connexion. Une meilleure approche serait également d’emballer le SqlConnection
dans un bloc d’utilisation:
using (SqlConnection conn = new SqlConnection(connssortingng)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdssortingng, conn)) { cmd.ExecuteNonQuery(); } }
Sinon, la connexion est inchangée par le fait qu’une commande qui l’utilisait était supprimée (peut-être est-ce ce que vous voulez?). Mais gardez à l’esprit qu’une connexion doit également être éliminée, et probablement plus importante qu’une commande.
MODIFIER:
Je viens de tester ceci:
SqlConnection conn = new SqlConnection(connssortingng); conn.Open(); using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn)) { Console.WriteLine(cmd.ExecuteScalar().ToSsortingng()); } using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn)) { Console.WriteLine(cmd.ExecuteScalar().ToSsortingng()); } conn.Dispose();
La première commande a été supprimée lorsque le bloc d’utilisation a été quitté. La connexion était toujours ouverte et bonne pour la deuxième commande.
La suppression de la commande ne permet donc pas de supprimer la connexion utilisée.
SqlCommand.Dispose ne sera pas suffisant car de nombreuses applications SqlCommand peuvent (re) utiliser le même SqlConnection. Centrez votre attention sur SqlConnection.
J’utilise ce modèle. J’ai cette méthode privée quelque part dans mon application:
private void DisposeCommand(SqlCommand cmd) { try { if (cmd != null) { if (cmd.Connection != null) { cmd.Connection.Close(); cmd.Connection.Dispose(); } cmd.Dispose(); } } catch { } //don't blow up }
Ensuite, je crée toujours des commandes SQL et des connexions dans un bloc try (mais sans être encapsulé dans un bloc using) et j’ai toujours un bloc finalement comme:
finally { DisposeCommand(cmd); }
L’object de connexion étant une propriété de l’object de commande rend un bloc d’utilisation peu pratique dans cette situation – mais ce modèle permet d’effectuer le travail sans encombrer votre code.