读取器关闭时无效尝试调用Read

时间:2014-11-29 15:52:39

标签: c# sqldatareader datareader

我遇到了sql datareader的问题。每当我尝试读取数据时,它都会给我一个错误,指出读取器关闭时无效尝试调用Read。请帮我弄清楚问题

private void button1_Click(object sender, EventArgs e)
    {
        string name = this.textBox1.Text;
        string connstring = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Gardezi\Documents\Visual Studio 2012\Projects\homeWork2\homeWork2\Database1.mdf;Integrated Security=True";
        SqlConnection con = new SqlConnection(connstring);
        string query = "Select * from diaryDB";
        SqlCommand com = new SqlCommand(query, con);
        SqlParameter p = new SqlParameter("name", name);
        con.Open();
        SqlDataReader d =  com.ExecuteReader();
        con.Close();
        deleteResult r = new deleteResult(d);
        r.Show();
    }

这是deleteResult

的构造函数
public deleteResult(SqlDataReader d)
    {

        InitializeComponent();
        while (d.Read())
        {
            this.comboBox1.Items.Add((d["Title"] +"-" +d["Description"]).ToString());
        }
    }

2 个答案:

答案 0 :(得分:1)

关闭连接后无法读取。 只需更改代码的这一部分:

发件人

(...)
con.Close();
deleteResult r = new deleteResult(d);
(...)

(...)
deleteResult r = new deleteResult(d);
con.Close();
(...)

答案 1 :(得分:1)

请尝试使用正确包含连接,命令和阅读器的using statement在适当的块中。

private void button1_Click(object sender, EventArgs e)
{
    string name = this.textBox1.Text;
    string connstring = @"....";
    string query = "Select * from diaryDB";
    using(SqlConnection con = new SqlConnection(connstring))
    using(SqlCommand com = new SqlCommand(query, con))
    {
        SqlParameter p = new SqlParameter("name", name);
        con.Open();
        using(SqlDataReader d =  com.ExecuteReader())
        {
           deleteResult r = new deleteResult(d);
           r.Show();
        }
    }
 }  

通过这种方式,当您从阅读器中读取时,连接保持打开状态。这对于避免错误至关重要。

更重要的一点是,您不必担心在不再需要时关闭并处理连接。从使用块的退出关闭并处理连接,命令和读取器也是例外情况。