1

我有下面的代码,我得到了异常

“已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它”。

我正在为这个项目使用 Microsoft Visual C# 2010 Express 和 Microsoft Access 2007。

namespace Database1
{
    public partial class Form1 : Form
    {
        OleDbConnection connection;
        public void connect()
        {
            connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;DataSource=|DataDirectory|\PBName1.accdb;Data Source=C:\Users\bvino_000\Downloads\PBName1.accdb");
            connection.Open();
        }
        public void close_connection()
        {
            connection.Close();
        }

    public Form1()
    {

        InitializeComponent();
       connect();

        OleDbDataReader reader = null;
        OleDbCommand command = new OleDbCommand("SELECT * from  PBInfo", connection);
        reader = command.ExecuteReader();


        while (reader.Read())
        {
            listBox1.Items.Add(reader[1].ToString());
        }
        close_connection();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        listBox2.Items.Add(listBox1.SelectedItem);
        string s = "";
        s = listBox1.SelectedItem.ToString();
        connect();
        string sql = "SELECT PBSize FROM PBInfo where PBName=" + " '" + s + "' ";

        try
        {
            OleDbDataReader reader = null;
            OleDbCommand command = new OleDbCommand(sql, connection);
            reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            while (reader.Read())
            {
                command.ExecuteReader();
            }

            reader.Close();
            command.Dispose();
            close_connection();

            if (connection.State != ConnectionState.Open)
            {
                connection.Open();
            }

            label2.Text = command.ExecuteReader().ToString();
            listBox1.Items.Remove(listBox1.SelectedItem);
        }
        catch(Exception ex)
        {
            ex.GetBaseException();
        }
        finally
        {
            close_connection();
        }          
    }

} }

4

3 回答 3

4

The reader in the Form's constructor is not closed. You should consider working with the using construct to avoid this:

using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
   ... 
}
于 2013-06-24T06:06:20.587 回答
0

You have forgotten to close reader on form contructor. When you execute button1_Click a reader is allready open

 public Form1()
{

    InitializeComponent();
   connect();

    OleDbDataReader reader = null;
    OleDbCommand command = new OleDbCommand("SELECT * from  PBInfo", connection);
    reader = command.ExecuteReader();


    while (reader.Read())
    {
        listBox1.Items.Add(reader[1].ToString());
    }
      **reader.Close();
      command.Dispose();**
    //close_connection();
}
于 2013-06-24T06:05:41.590 回答
0

From Retrieving Data Using a DataReader

Note that while a DataReader is open, the Connection is in use exclusively by that DataReader. You cannot execute any commands for the Connection, including creating another DataReader, until the original DataReader is closed.

Either you should close the current OleDbDataReader or define different OleDbConnection for each OleDbDataReader.

于 2013-06-24T06:07:34.020 回答