0

我正在使用C#和MySQL后端制作客户端 - 服务器应用程序。我试图找出哪些对象是用来创建用于mysql的连接的。 问题的根源是未正确结束连接。用mysql调试c#代码的正确方法

我正在寻找一些方法来检查内部/的Visual Studio之外的创建连接的所有对象。

从MySQL方面我看到所有的连接,以及其中有多少是从客户端,但在客户现场,我不知道哪个对象/ BackgroundWorker的是做连接。

+1

搜索MySqlConnection对象的每个实例并检查它们是否正确地包含在using语句中 – Steve

回答

0

从我读,我认为你要确保你的应用程序仅打开1个连接,并确保连接正确关闭。

我正在使用一个类来连接到数据库,它只是有一个打开和关闭连接的select方法,其优点是你不需要单例或者需要担心多个线程,因为当选择方法被执行的连接会自动关闭:

/// <summary> 
/// class which controlls the database, 
/// </summary> 
public class DBConnect 
{ 
    private MySqlConnection connection; 

    /// <summary> 
    /// the constructor which starts to initialize the database. 
    /// </summary> 
    /// <param name="username"></param> 
    /// <param name="password"></param> 
    public DBConnect(string username, string password) 
    { 
     Initialize(username, password); 
    } 

    /// <summary> 
    /// initiates connection string for the database. 
    /// </summary> 
    /// <param name="username"></param> 
    /// <param name="password"></param> 
    private void Initialize(string username, string password) 
    { 
     string server = "Localhost"; 

     string database = ""; 
     string connectionString; 
     connectionString = "SERVER=" + server + ";" + "DATABASE=" + 
     database + ";" + "UID=" + username + ";" + "PASSWORD=" + password + ";"; 

     connection = new MySqlConnection(connectionString); 
    } 


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

       //case 1045: 
       // MessageBox.Show("Invalid username/password, please try again"); 
       // break; 
      } 
      MessageBox.Show(ex.Message + "\r\n" + 
       ex.StackTrace); 
      return false; 
     } 
     catch (InvalidOperationException ioe) 
     { 
      Console.WriteLine(ioe); 
      MessageBox.Show("Er is al een connectie geopend"); 
      return false; 
     } 
    } 

    /// <summary> 
    /// closes the connection with the database 
    /// </summary> 
    /// <returns>true or false depending on the succes of closing the connection</returns> 
    private bool CloseConnection() 
    { 
     try 
     { 
      connection.Close(); 
      return true; 
     } 
     catch (MySqlException ex) 
     { 
      Console.WriteLine(ex.Message); 
      return false; 
     } 
    } 

    /// <summary> 
    /// generally used to get multpile rows of data from the datbase 
    /// </summary> 
    /// <param name="query">SQL statement</param> 
    /// <returns></returns> 
    public DataTable Select(MySqlCommand cmd) 
    { 
     //Open connection 
     if (this.OpenConnection() == true) 
     { 
      //Create Command 
      cmd.Connection = connection; 

      //Read the data and store it in a DataTable 
      DataTable dt = new DataTable(); 
      MySqlDataAdapter da = new MySqlDataAdapter(cmd); 
      try 
      { 
       da.Fill(dt); 
      } 
      catch (MySqlException e) 
      { 
       MessageBox.Show("An exception has occured loading the data: \n" + e.Message); 
       Console.WriteLine(e.Message); 
      } 

      //close Connection 
      this.CloseConnection(); 

      //return list to be displayed 
      return dt; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 
0

我正在使用此代码:

public DataSet MySQL_Select(string query) 
     { 
      MySql.Data.MySqlClient.MySqlConnection msqlConnection = null; 
      msqlConnection = new MySql.Data.MySqlClient.MySqlConnection("server=" + MYSQL_SERVER + ";user id=" + MYSQL_login + ";Password=" + MYSQL_password + ";database=" + MYSQL_SCHEMAS + ";persist security info=False; Allow Zero Datetime=true "); 
DataSet DS = new DataSet(); 
      try 
      { 
       MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(query, msqlConnection); 
       mySqlDataAdapter.Fill(DS); 
      } 
      catch (Exception er) 
      { 
       MessageBox.Show(er.Message); 
      } 
      finally 
      { 
       msqlConnection.Close(); 
      } 
      return (DS); 
     } 

我可以改进?可以确定我总是密切联系,因为从我所知道的最后声明来说是正确的。

0

正如史蒂夫的评论提到,包装用块;这将在超出范围时关闭并处理连接对象。

using (IDbConnection conn = new MySql.Data.MySqlClient.MySqlConnection(...)) 
{ 
    using (IDbCommand cmd = new MySql.Data.MySqlClient.MySqlCommand("select ...", conn)) 
    { 
     conn.Open(); 

     var reader = cmd.ExecuteReader()'; 
     // process reader, etc 
    } 
} 

IDisposable的实施者应该是一个使用内。
的IDbConnection不是应该是全局变量,它们应当被构造,用于和布置在范围,或传递到方法,作为参数。