我没有关闭以前的DataReader,但在哪里?

时间:2011-12-01 23:51:41

标签: c# exception ms-access oledb

我更改了之前的代码,因此我没有使用'使用'。它工作得更早,不同类中的代码基本上代表相同的东西,但它的工作。

我已经盯着它看了2个小时,我无法弄清楚问题出在哪里。

我只有一个阅读器,但每次我使用DisplayFileContent方法时都会收到错误:错误:There is already an open DataReader associated with this command which must be closed first.

// May be public so we can display
// content of file from different forms.
public void DisplayFileContent(string filePath)
{
    // Counting all entries.
    int countEntries = 0;

    // Encrypting/Decrypting  data.
    EncryptDecrypt security = new EncryptDecrypt();

    using (OleDbConnection connection = new OleDbConnection())
    {
        connection.ConnectionString =
            "Provider=Microsoft.ACE.OLEDB.12.0;" +
            "Data Source=" + filePath + ";" +
            "Persist Security Info=False;" +
            "Jet OLEDB:Database Password=" + 
            hashPhrase.ShortHash(storedAuth.Password) + ";";

        using (OleDbCommand command = new OleDbCommand
            ("Select * FROM PersonalData", connection))
        {
            OleDbDataReader read;

            try
            {
                // Open database connection.
                connection.Open();

                // Create a data reader.
                read = command.ExecuteReader();

                // Clearing the textbox before proceeding.
                txtDisplay.Text = string.Empty;

                // Checking if there is any data in the file.
                if (read.HasRows)
                {
                    // Reading information from the file.
                    while (read.Read())
                    {
                        // Count all entries read from the reader.
                        countEntries++;

                        // Reading all values from the file as string.
                        // While each string is encrypted, we must decrypt them.
                        // User name and password is the same as user provided
                        // while authentication.
                        txtDisplay.Text += "=== Entry ID: " + read.GetValue(0) +
                            " ===" + Environment.NewLine;
                        txtDisplay.Text += "Type: " + security.Decrypt
                            (read.GetString(1), storedAuth.Password,
                            storedAuth.UserName) + Environment.NewLine;
                        if (!read.IsDBNull(2))
                            txtDisplay.Text += "URL: " +
                                security.Decrypt(read.GetString(2),
                                storedAuth.Password, storedAuth.UserName) +
                                Environment.NewLine;
                        if (!read.IsDBNull(3))
                            txtDisplay.Text += "Software Name: " +
                                security.Decrypt(read.GetString(3),
                                storedAuth.Password, storedAuth.UserName) +
                                Environment.NewLine;
                        if (!read.IsDBNull(4))
                            txtDisplay.Text += "Serial Code: " +
                                security.Decrypt(read.GetString(4),
                                storedAuth.Password, storedAuth.UserName) +
                                Environment.NewLine;
                        if (!read.IsDBNull(5))
                            txtDisplay.Text += "User Name: " +
                                security.Decrypt(read.GetString(5),
                                storedAuth.Password, storedAuth.UserName) +
                                Environment.NewLine;
                        if (!read.IsDBNull(6))
                            txtDisplay.Text += "Password: " +
                                security.Decrypt(read.GetString(6),
                                storedAuth.Password, storedAuth.UserName) +
                                Environment.NewLine;
                        txtDisplay.Text += Environment.NewLine;
                    }
                }
                else
                {
                    txtDisplay.Text = "There is nothing to display! " +
                        "You must add something before so I can display anything here.";
                }

                // Displaying number of entries in the status bar.
                tsslStatus.Text = "A total of " + countEntries + " entries.";

                // Selecting 0 character to make sure text
                // isn't completly selected.
                txtDisplay.SelectionStart = 0;

                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:6)

您正在catch块之前调用command.ExecuteNonQuery。您需要先关闭DataReader。

我建议在使用块中包装使用datareader的代码:

using(OleDbDatareader read = command.ExecuteReader())
{

   ...

}

如上所述,command.ExecuteNonQuery()用于执行您不希望返回结果的命令。这些通常是插入,更新或删除,但也可能包括执行相同操作的存储过程调用,或者您不关心返回结果的存储过程调用

答案 1 :(得分:3)

行前

command.ExecuteNonQuery();

你需要:

read.Close();

此外,了解使用连接不会自动关闭它至关重要。因此,在使用语句连接结束之前,您需要一个

connection.Close();

答案 2 :(得分:1)

我看不到关闭数据阅读器的代码。

在catch部分后最后添加:

   finally {
        if (read != null)
        {
            read.Close();
        }
}

编辑#1:我犯了一个错误,你应该在执行下一个命令之前关闭它,所以要么在catch块之前删除最后一行(如果合适的话)并添加finally块或者只是添加用于读取变量。