[C#][.net] Prob fermeture de connexion: bug .NET ou bug Vendeeman?

Résolu
vendeeman85 Messages postés 6 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 28 février 2007 - 28 févr. 2007 à 10:34
vendeeman85 Messages postés 6 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 28 février 2007 - 28 févr. 2007 à 16:38
Bonjour à tous,


J'ai un soucis avec mes fermetures de connexion SQL. Le principe est très simple. J'ai développé un outil qui permet d'exécuter des scripts SQL sur une base de donnée. Si je me connecte en Master et que je choisit de dropper une base "A", pas de soucis. Par contre si je teste au préalable la validité de ma base "A" (par une simple requete Select blabla...) et que ensuite je me connecte en Master pour dropper ma base, il me met que "la base "A est présentement utilisée". Mon soucis est apparu dans un gros programme, j'ai donc simplifié le code au maximum pour isoler le problème. J'ai donc dans une simple fenetre 2 boutons:


// Le bouton 1 fait un simple test d'existence d'une base
private void button1_Click(object sender, EventArgs e)
        {
            // Création de la connexion
            IDbConnection _Connexion = new System.Data.SqlClient.SqlConnection("Persist Security Info=False;User ID=sa;Initial Catalog=TEST_JU2;Data Source=XXX;");


            // Ouverture de connexion
            _Connexion.Open();


            // Création de la commande
            IDbCommand command = new System.Data.SqlClient.SqlCommand("SELECT COUNT(1) FROM sysobjects", ((System.Data.SqlClient.SqlConnection)_Connexion));
            command.CommandTimeout = 1200;
            command.CommandType = CommandType.Text;


            // Exécution de la commande
            int result = command.ExecuteNonQuery();
           
            // Fermeture de connexion
            _Connexion.Close();
        }


// Le bouton 2 tente de dropper la base TEST_JU2 dont on peut la validité avec le bouton 1
private void button2_Click(object sender, EventArgs e)
        {
            // Création de la connexion
            IDbConnection _Connexion2 = new System.Data.SqlClient.SqlConnection("Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=XXX;");
           
            // Ouverture de connexion   
            _Connexion2.Open();


            // Création de la commande
            IDbCommand command = new System.Data.SqlClient.SqlCommand("drop database TEST_JU2", ((System.Data.SqlClient.SqlConnection)_Connexion2));
            command.CommandTimeout = 1200;
            command.CommandType = CommandType.Text;


            // Exécution de la commande
            int result = command.ExecuteNonQuery();


            // Fermeture de connexion
            _Connexion2.Close();
        }




Si je clique sur le bouton 2 seulement, tout fonctionne. Si je le clique sur le bouton 2 après avoir cliqué sur le bouton 1, il met le message d'erreur "Impossible de supprimer le base de données 'TEST_JU2', parce qu'il est présentement utilisé." (avec une faute de français en prime mais la n'est pas le sujet ;) )


bref il doit resté une connexion active, ouverte ou je ne sais pas trop. J'ai essayé de faire:
_Connexion.Dispose();
_Connexion = null;
command.Dispose();
command = null;
Même en mettant le code du bouton 1, un Dispose(); (qui est censé virer toute les ressources utilisées) puis le code du bouton 2, cela ne fonctionne pas.


Si quelqu'un à une idée de la source précise du problème et voir même d'une solution pour corriger le problème, mais dejàa si je connais le problème ça serait bien :D


Merci d'avance,


Vdm


 

1 réponse

vendeeman85 Messages postés 6 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 28 février 2007
28 févr. 2007 à 16:38
SOLUTION:

Bon j'ai enfin trouvé la solution à mon problème dans un autre post de ce fofo: il suffit de rajouter pooling = false; dans les infos de connexion afin de ne pas se retrouver avec un pool de connexion qui reste ouvert.
 
IDbConnection _Connexion = new System.Data.SqlClient.SqlConnection("Persist Security Info=False;User ID=sa;Initial Catalog=TEST_JU2;Data Source=XXX;pooling=false;" );
 
OU
 
mettre
 
System.Data.SqlClient.SqlConnection.ClearPool((System.Data.SqlClient.SqlConnection)_Connexion); // ferme le pool de connexion
àprès le _Connexion.Close();
 
Par contre, je ne connais pas l'inpacte sur les perf ou autres effets de bord encore. :D
 
Merci à tous,
 
VDM
3
Rejoignez-nous