gpt4 book ai didi

c# - 从 c# 处理到 MySql 的连接的最佳方法是什么

转载 作者:可可西里 更新时间:2023-11-01 07:13:06 24 4
gpt4 key购买 nike

我正在开发一个连接到 MySql 服务器的 C# 应用程序。大约有 20 个函数将连接到数据库。此应用程序将部署在 200 多台机器上。我正在使用以下代码连接到我的数据库,所有功能都相同。问题是,当部署在 200 多台机器上时,我可以看到一些连接没有关闭并且仍然存在。

连接字符串:

<add key="Con_Admin" value="server=test-dbserver; database=test_admindb; uid=admin; password=1Password; Use Procedure Bodies=false;" />

应用程序 [Global.cs] 中全局连接字符串的声明:

public static MySqlConnection myConn_Instructor = new MySqlConnection(ConfigurationSettings.AppSettings["Con_Admin"]);

数据库查询函数:

  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;
}

最佳答案

您应该使用使用一次性用品的工作单元方法。 MySqlConnection 类型是一次性的,因此应该干净地包装在 using block 中:

using (MySqlConnection connection = CreateConnection("Con_Admin")) {
// Do work here.
}

它的作用是确保在关闭连接的连接对象上调用 Dispose()。这非常重要。

我还注意到您正在为连接字符串使用 appSettings,实际上在配置文件中有一个专用的 connectionStrings 元素:

<connectionStrings>
<add name="Con_Admin" connectionString="..." providerName="MySql.Data" />
</connectionStrings>

您可以使用它来创建连接实例:

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);
}

最后一个兴趣点,你应该尝试使用参数化查询,它可以防止 sql 注入(inject)攻击:

string query = "SELECT * FROM SomeTable Where SomeField = @field";

using (MySqlCommand command = new MySqlCommand(query))
{
command.Parameters.AddWithValue("@field", "someFieldValue");
}

希望对您有所帮助!

关于c# - 从 c# 处理到 MySql 的连接的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2971942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com