2012-10-02 123 views
0

我有一个简单的C#MySQL连接类为:连接泄漏

using System; 
using System.Data; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 
using MySql.Data.MySqlClient; 


namespace FSB 
{ 
    public class DBConnect 
    { 
     private MySqlConnection connection; 
     private string server; 
     public string port; 
     private string database; 
     private string uid; 
     private string password; 

     //Constructor 
     public DBConnect() 
     { 
      Initialize(); 
     } 

     ~DBConnect() 
     { 
      //close connection 
      this.CloseConnection(); 

     } 


     //Initialize values 
     private void Initialize() 
     { 



      // Local Database 
      server = "localhost"; 
      database = "mydatabase"; 
      uid = "user"; 
      password = "pass"; 


      string connectionString; 
      connectionString = "SERVER=" + server + ";Port=" + port + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";"; 

      connection = new MySqlConnection(connectionString); 
     } 


     //open connection to database 
     private bool OpenConnection() 
     { 
      try 
      { 
       connection.Open(); 
       return true; 
      } 
      catch (MySqlException ex) 
      { 
       //When handling errors, you can your application's response based on the error number. 
       //The two most common error numbers when connecting are as follows: 
       //0: Cannot connect to server. 
       //1045: Invalid user name and/or password. 
       switch (ex.Number) 
       { 
        case 0: 
         Console.WriteLine("Cannot connect to server. Contact administrator"); 
         break; 

        case 1045: 
         Console.WriteLine("Invalid username/password, please try again"); 
         break; 
       } 
       return false; 
      } 
     } 

     //Close connection 
     public bool CloseConnection() 
     { 
      try 
      { 
       if (connection.State == System.Data.ConnectionState.Open) 
       { 
        connection.Close(); 
        connection.Dispose(); 
       } 
      } 
      catch (MySqlException ex) 
      { 
       Console.WriteLine(ex.Message); 
       return false; 
      } 
      return true; 
     } 

     //Insert statement 
     public void Insert(String query) 
     { 

      //open connection 
      if (this.OpenConnection() == true) 
      { 
       //create command and assign the query and connection from the constructor 
       MySqlCommand cmd = new MySqlCommand(query, connection); 

       //Execute command 
       cmd.ExecuteNonQuery(); 

       //close connection 
       this.CloseConnection(); 
      } 
     } 

     //Update statement 
     public void Update(string query) 
     { 

      //Open connection 
      if (this.OpenConnection() == true) 
      { 
       //create mysql command 
       MySqlCommand cmd = new MySqlCommand(); 
       //Assign the query using CommandText 
       cmd.CommandText = query; 
       //Assign the connection using Connection 
       cmd.Connection = connection; 

       //Execute query 
       cmd.ExecuteNonQuery(); 

       //close connection 
       this.CloseConnection(); 
      } 
     } 

     //Delete statement 
     public void Delete(string query) 
     { 

      if (this.OpenConnection() == true) 
      { 
       MySqlCommand cmd = new MySqlCommand(query, connection); 
       cmd.ExecuteNonQuery(); 
       this.CloseConnection(); 
      } 
     } 

     public MySqlDataReader getRecord(string query) 
     { 

      if (this.OpenConnection() == true) 
      { 
       //create mysql command 
       MySqlCommand cmd = new MySqlCommand(); 
       MySqlDataReader reader; 

       //Assign the query using CommandText 
       cmd.CommandText = query; 
       //Assign the connection using Connection 
       cmd.Connection = connection; 

       //Execute query 
       reader = cmd.ExecuteReader(); 
       return reader; 
      } 

      return null; 

     } 


     //Check Duplicate statement return true if not found 
     public bool checkDuplicate(string tableName ,String fieldName,String checkValue) 
     { 

      //Open connection 
      if (this.OpenConnection() == true) 
      { 
       //create mysql command 
       MySqlCommand cmd = new MySqlCommand(); 
       MySqlDataReader reader; 
       int rowCount = 0; 

       //Assign the query using CommandText 
       String query = "Select * from `" + tableName + "` Where `"+fieldName + "` = '"+ checkValue +"'"; 
       cmd.CommandText = query; 
       //Assign the connection using Connection 
       cmd.Connection = connection; 

       //Execute query 
       reader = cmd.ExecuteReader(); 
       while (reader.Read()) 
       { 
        //get rows 
        rowCount++; 
       } 
       //close connection 
       this.CloseConnection(); 

       if (rowCount > 0) 
       { 
        return false; 
       } 


      } 
      return true; 
     } 

    } 
} 

谁能请我在哪里失去连接的连接保持打开即使对象是超出范围的每一次我用来做任何操作一个新的连接被创建并且以前的连接没有关闭。所以我用完了连接限制到mysql

+0

终结者不是确定性的;这意味着当对象超出范围时不会运行。通常几秒钟后运行,但这取决于垃圾收集器(GC)。因此,技术上来说,终结器可能永远不会运行,因为空垃圾回收器是一个有效的实现:[大家都认为垃圾回收是错误的](http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09 /10047586.aspx)。 –

回答

2

我建议你使用using blok以清洁你的非托管对象,在此示例中的连接

using (var connection = new MySqlConnection("...")) 
{ 
    .... 
} 

诺塔:使用BLOK执行在瑞德尔治疗结束处置以清理

public void Insert(String query) 
{ 
     using(var connection = new MySqlConnection("...")) 
     { 
      connection.Open(); 
      using(var cmd = new MySqlCommand(query, connection)) 
      { 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
+0

在这种情况下,他的类DBConnect需要实现IDisposable并且是使用语句中包装的对象。 –

+0

是的,我知道,但为此我需要更改完整的应用程序,我正在考虑在类中进行更改以解决此问题。有没有办法这样做? – Champ

+0

@Champ我认为很容易修改 –