Giải pháp cuối cùng:
Kết nối đã được thêm vào nhóm kết nối. Vì vậy, tôi đóng nó, nhưng nó vẫn còn thể chất mở. Với tham số ConnectionString "Pooling = false" hoặc các phương thức tĩnh MySqlConnection.ClearPool (kết nối) và MySqlConnection.ClearAllPools, vấn đề có thể tránh được. Lưu ý rằng vấn đề là, rằng kết nối vẫn còn sống khi tôi đóng ứng dụng. Mặc dù tôi đã đóng nó. Vì vậy, hoặc là tôi không sử dụng kết nối tổng hợp ở tất cả hoặc tôi xóa các hồ bơi cụ thể trước khi đóng kết nối và vấn đề được giải quyết. Tôi sẽ dành thời gian để tìm ra giải pháp tốt nhất trong trường hợp của tôi là gì.Sử dụng MySQLConnection trong C# không đóng đúng
Nhờ tất cả những ai đã trả lời! Nó giúp tôi hiểu các khái niệm về C# tốt hơn và tôi đã học được rất nhiều từ đầu vào hữu ích. :)
===
Vấn đề gốc:
tôi đã tìm kiếm một thời gian bây giờ và chưa tìm ra giải pháp cho vấn đề của tôi: Tôi mới đến C# và cố gắng viết một lớp để làm cho MySql Connections dễ dàng hơn. Vấn đề của tôi là, sau khi tôi mở một kết nối và đóng nó lại. Nó vẫn mở trong Database và bị hủy bỏ.
Tôi đang sử dụng câu lệnh 'đang sử dụng', tất nhiên, nhưng kết nối vẫn mở và bị hủy sau khi tôi thoát khỏi chương trình.
Đây là những gì mã của tôi trông giống như:
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
}
}
}
Người quản lý lớp học Cơ sở dữ liệu mở kết nối và đóng nó khi xử lý:
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);
//}
Vì vậy, tôi đã kiểm tra nó trong trình gỡ lỗi và Dispose () -method được gọi và thực hiện một cách chính xác. Tôi đang thiếu gì? Có điều gì tôi đã làm sai hoặc hiểu lầm?
Mọi trợ giúp đều được đánh giá cao!
Greetings, Simon
PS: Chỉ trong trường hợp, DataReader() - Phương pháp (phiên bản cập nhật):
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, tôi cố gắng sử dụng yield return:
foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
//...
}
Và tôi đã thay đổi phương thức DataReader:
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;
}
}
}
}
Nó hoạt động theo cách tôi có thể truy xuất dữ liệu, nhưng tôi vẫn gặp sự cố tương tự: Kết nối không được đóng đúng cách. :(
Vì bạn không có bất kỳ tài nguyên không được quản lý nào, bạn không cần trình hoàn thiện. – SLaks
Đúng vậy. Nhưng nó không làm tổn thương hiện tại, phải không? Đúng nếu tôi nhầm. Mục tiêu chính là đóng các kết nối không sử dụng ngay khi chúng không còn cần thiết nữa. Mô hình này dường như là một cách dễ dàng để đạt được mục tiêu này. Tôi đã thực hiện nó theo cách được thể hiện trong nhiều ví dụ trên web. Cuối cùng tôi sẽ thay đổi nó để loại bỏ mã dư thừa. – Skalli
Đó là một hit hiệu suất, nhưng nếu không, không. – SLaks