我正在使用C#和MySQL后端制作客户端 - 服务器应用程序。我试图找出哪些对象是用来创建用于mysql的连接的。 问题的根源是未正确结束连接。用mysql调试c#代码的正确方法
我正在寻找一些方法来检查内部/的Visual Studio之外的创建连接的所有对象。
从MySQL方面我看到所有的连接,以及其中有多少是从客户端,但在客户现场,我不知道哪个对象/ BackgroundWorker的是做连接。
我正在使用C#和MySQL后端制作客户端 - 服务器应用程序。我试图找出哪些对象是用来创建用于mysql的连接的。 问题的根源是未正确结束连接。用mysql调试c#代码的正确方法
我正在寻找一些方法来检查内部/的Visual Studio之外的创建连接的所有对象。
从MySQL方面我看到所有的连接,以及其中有多少是从客户端,但在客户现场,我不知道哪个对象/ BackgroundWorker的是做连接。
从我读,我认为你要确保你的应用程序仅打开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;
}
}
}
我正在使用此代码:
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);
}
我可以改进?可以确定我总是密切联系,因为从我所知道的最后声明来说是正确的。
正如史蒂夫的评论提到,包装用块;这将在超出范围时关闭并处理连接对象。
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不是应该是全局变量,它们应当被构造,用于和布置在范围,或传递到方法,作为参数。
搜索MySqlConnection对象的每个实例并检查它们是否正确地包含在using语句中 – Steve