/****************************************************************************/
Bon j'ai enfin trouvé la solution à mon problème ci dessous: il suffit de rajouter pooling = false; dans les info 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.
Merci à tous,
VDM
/****************************************************************************/
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
Merci d'avance,
Vdm
Message édité par vendeeman le 28-02-2007 à 16:36:55