我在C#中有一个Windows Forms应用程序,该应用程序的按钮之一运行如下代码:

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


每当我运行该应用程序时,都会遇到以下异常:“已经有一个与此Connection关联的打开的DataReader,必须先关闭它。”

但是不应该这样。我在此代码中使用1个阅读器,并且没有其他异步运行。如您所见,在循环中的每次迭代之后,我都关闭了阅读器并打开了一个新的阅读器。在应用程序的初始化中,我使用了与同一连接关联的读取器,但是当完成来自该读取器的数据处理后,我将其关闭并处置。

我希望有人能帮助我解决这个谜,谢谢。

最佳答案

在您的代码中,如果某些东西在名为“处理东西”的部分上产生异常,那么您将使阅读器保持打开状态。

如果即使在出现异常的情况下也需要确保某些东西在使用后会被丢弃,请使用using子句:

if (rowCount == 1)
{
    MySqlCommand cmd = new MySqlCommand("SELECT * FROM thatTable WHERE someField = " + stuff.property +  ";", connection);
    using(MySqlDataReader reader = cmd.ExecuteReader())
    {

        //Processing stuff from the reader here

    }
}

10-08 08:47