我正在研究连接到MySql服务器的ac#应用程序.大约有20个函数将连接到数据库.该应用程序将部署在200台以上的机器上.我使用以下代码连接到我的数据库,这对所有功能都是相同的.问题是,我可以在200多台机器上部署时,某些连接没有关闭并且仍然存在.
连接字符串:
<add key="Con_Admin" value="server=test-dbserver; database=test_admindb; uid=admin; password=1Password; Use Procedure Bodies=false;" />
Run Code Online (Sandbox Code Playgroud)
应用程序[Global.cs]中的全局声明连接字符串:
public static MySqlConnection myConn_Instructor = new MySqlConnection(ConfigurationSettings.AppSettings["Con_Admin"]);
Run Code Online (Sandbox Code Playgroud)
查询数据库的功能:
public static DataSet CheckLogin_Instructor(string UserName, string Password)
{
DataSet dsValue = new DataSet();
//MySqlConnection myConn = new MySqlConnection(ConfigurationSettings.AppSettings["Con_Admin"]);
try
{
string Query = "SELECT accounts.str_nric AS Nric, accounts.str_password AS `Password`," +
" FROM accounts " +
" WHERE accounts.str_nric = '" + UserName + "' AND accounts.str_password = '" + Password + "\'";
MySqlCommand cmd = new MySqlCommand(Query, Global.myConn_Instructor);
MySqlDataAdapter da = new MySqlDataAdapter();
if (Global.myConn_Instructor.State == ConnectionState.Closed)
{
Global.myConn_Instructor.Open();
}
cmd.ExecuteScalar();
da.SelectCommand = cmd;
da.Fill(dsValue);
Global.myConn_Instructor.Close();
}
catch (Exception ex)
{
Global.myConn_Instructor.Close();
ExceptionHandler.writeToLogFile(System.Environment.NewLine + "Target : " + ex.TargetSite.ToString() + System.Environment.NewLine + "Message : " + ex.Message.ToString() + System.Environment.NewLine + "Stack : " + ex.StackTrace.ToString());
}
return dsValue;
}
Run Code Online (Sandbox Code Playgroud)
You should be using a unit-of-work approach using disposables. The MySqlConnection type is disposable, so should be cleanly wrapped in using blocks:
using (MySqlConnection connection = CreateConnection("Con_Admin")) {
// Do work here.
}
Run Code Online (Sandbox Code Playgroud)
What this does, is it ensures that Dispose() is called on the connection object, which closes the connection. This is incredibly important.
我也注意到你正在使用appSettings连接字符串,配置文件中实际上有一个专用的connectionStrings元素:
<connectionStrings>
<add name="Con_Admin" connectionString="..." providerName="MySql.Data" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
您可以使用它来创建连接实例:
public MySqlConnection CreateConnection(string name)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentException("Connection name must be provided", "name");
string connection = ConfigurationManager.ConnectionStrings[name].ConnectionString;
return new MySqlConnection(connection);
}
Run Code Online (Sandbox Code Playgroud)
最后一点,您应该尝试使用参数化查询,以防止SQL注入攻击:
string query = "SELECT * FROM SomeTable Where SomeField = @field";
using (MySqlCommand command = new MySqlCommand(query))
{
command.Parameters.AddWithValue("@field", "someFieldValue");
}
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!