我有一个Windows窗体应用程序在C#中具有一个按钮运行这样的代码:C#中,我守捉一个多个MySQL读者异常时,只有1读卡器
private void aCertainButton_Click(object sender, EventArgs e)
{
if (folderFinder.ShowDialog() == DialogResult.OK)
{
if (openConnection())
{
foreach (Thingy stuff in aCertainCollection)
{
string sqlCommandString = "SELECT COUNT(*) FROM thatTable WHERE someField = " + stuff.property + ";";
try
{
MySqlCommand count = new MySqlCommand(sqlCommandString, connection);
int rowCount = 0;
object o = count.ExecuteScalar();
if (o != null)
{
rowCount = int.Parse(o.ToString());
}
if (rowCount == 1)
{
MySqlCommand cmd = new MySqlCommand("SELECT * FROM thatTable WHERE someField = " + stuff.property + ";", connection);
MySqlDataReader reader = cmd.ExecuteReader();
//Processing stuff from the reader here
reader.Close();
reader.Dispose();
}
}
catch (MySqlException mex)
{
Console.WriteLine(mex.Message);
}
}
closeConnection();
}
}
}
任何时候我跑该应用程序捕获以下异常:“已经有一个与此连接关联的打开的DataReader,必须先关闭它。”
但不应该有。我在这段代码中使用了1个阅读器,并且没有其他东西异步运行。正如你所看到的,我关闭了阅读器,并在循环中的每次迭代之后打开一个新阅读器。我在应用程序的初始化过程中使用了与相同连接关联的阅读器,但是在完成数据处理后,关闭它并处理它。
我很感谢任何人都可以帮助我解决这个谜,谢谢。
你的代码是SQL注入漏洞可能开:
当你需要确保它的东西在例外的情况下,甚至使用后,再使用
using
clausule配置。请阅读并使用参数化查询。 –看起来你正在使用全局连接。是否有可能在您打开代码中的第一个之前打开了一个阅读器?我强烈建议在需要时创建连接,并确保将所有可丢弃对象放在'using'语句中。 https://msdn.microsoft.com/en-us/library/ms971481.aspx#adonetbest_topic5 – juharr
@Daniel Mann谢谢,但这是一个小型的实用程序应用程序,我只为自己写。一切都完全是本地的。我认为问题必须是本地的,而不是来自攻击者。 –