Utiliser MySQLConnection en C # ne se ferme pas correctement
Solution finale:
La connexion a été ajouté au pool de connexion. Alors je l'ai fermé, mais il restait toujours ouvrir physiquement. Avec la ConnectionString Paramètre "mise en commun=false" ou les méthodes statiques MySqlConnection.ClearPool(connexion) et MySqlConnection.ClearAllPools le problème peut être évité. Notez que le problème, c'est que la connexion était encore vivant quand j'ai fermé l'application. Même si je l'ai fermé. Donc, soit je n'ai pas utiliser le regroupement de connexion ou je claire spécifiques de la piscine avant de fermer la connexion et le problème est résolu. Je vais prendre mon temps à essayer de comprendre quelle est la meilleure solution dans mon cas.
Merci à tous ceux qui ont répondu! Il a aidé mon comprendre les concepts de C# mieux et j'ai appris beaucoup de l'apport utile. 🙂
===
Problème D'Origine:
J'ai cherché pendant un certain temps maintenant et je n'ai pas trouvé la solution à mon problème:
Je suis nouveau en C# et essayer d'écrire une classe pour faire les Connexions MySql plus facile. Mon problème est que, après que je l'ouvrir et le fermer. Il est toujours ouverte dans la Base de données et obtient abandonnée.
Je suis en utilisant le 'l'aide de la "déclaration", bien sûr, mais la connexion est toujours ouverte et obtient abandonnée après que j'ai quitter le programme.
Voici ce que mon code ressemble à ceci:
using (DatabaseManager db = new DatabaseManager())
{
using (MySqlDataReader result = db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
//Do stuff here
}
}
}
La classe gestionnaire de Base de données ouvre la connexion et il se ferme en cas de cession:
public DatabaseManager()
{
this.connectionString = new MySqlConnectionStringBuilder("Server=localhost;Database=businessplan;Uid=root;");
connect();
}
private bool connect()
{
bool returnValue = true;
connection = new MySqlConnection(connectionString.GetConnectionString(false));
connection.Open();
}
public void Dispose()
{
Dispose(true);
}
public void Dispose(bool disposing)
{
if (disposing)
{
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
connection.Dispose();
}
}
//GC.SuppressFinalize(this);//Updated
}
//Updated
//~DatabaseManager()
//{
// Dispose(false);
//}
Alors, j'ai vérifié dans le débogueur et le dispose()-méthode est appelée et s'exécute correctement.
Ce qui me manque? Est-je fait quelque chose de mal ou mal compris?
Toute aide est très appréciée!
Salutations,
Simon
P. S.:
Juste au cas où, le DataReader()-méthode (version mise à Jour):
public IEnumerable<IDataReader> DataReader(String query)
{
using (MySqlCommand com = new MySqlCommand())
{
com.Connection = connection;
com.CommandText = query;
using (MySqlDataReader result = com.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
{
while (result.Read())
{
yield return (IDataReader)result;
}
}
}
}
Ok, j'ai essayé d'utiliser le taux de retour:
foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
//...
}
Et j'ai changé le DataReader-méthode:
public IEnumerable<IDataReader> DataReader(String query)
{
using (MySqlCommand com = new MySqlCommand())
{
com.Connection = connection;
com.CommandText = query;
using (MySqlDataReader result = com.ExecuteReader())
{
while (result.Read())
{
yield return (IDataReader)result;
}
}
}
}
Il fonctionne de la manière que je peux récupérer les données, mais j'ai toujours le même problème: La connexion n'est pas fermée correctement. 🙁
source d'informationauteur Skalli
Vous devez vous connecter pour publier un commentaire.
Im pas sûr au sujet de mysqlconnection mais le compteur de sql server partie utilise le regroupement de Connexion et ne se ferme pas lorsque vous appelez la fermer au lieu de cela il le met dans le pool de connexion!
Edit: assurez-vous de disposer du Lecteur, de Commande, de Connexion et de l'objet!
Edit: Résolu avec la ConnectionString Paramètre "mise en commun=false" ou les méthodes statiques MySqlConnection.ClearPool(connexion) et MySqlConnection.ClearAllPools()
Vous devez envelopper la Commande et le DataReader dans
using
consolidés ainsi.Selon le mysql de docs, MySQLConnection n'est pas fermée quand elle est hors de portée. Par conséquent, vous ne devez pas l'utiliser à l'intérieur d'une aide.
Devis...
"Si le MySqlConnection est hors de portée, il n'est pas fermé. Par conséquent, vous devez fermer explicitement la connexion en appelant MySqlConnection.Près ou MySqlConnection.Disposer."
Ont un coup d'oeil à l'aide de quelque chose comme ceci: