【问题标题】:Invalid attempt to call Read when reader is closed阅读器关闭时调用 Read 的尝试无效
【发布时间】:2014-11-29 15:52:38
【问题描述】:

我的 sql 数据读取器有问题。每当我尝试读取数据时,它都会给我一个错误,提示在阅读器关闭时调用 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());
        }
    }

【问题讨论】:

  • 如果DataReader 的连接已关闭,您将无法访问它。它是数据库的开放流,而不是像DataTable 这样的内存集合。所以在你关闭它之前调用deleteResult(多么奇怪的名字)。

标签: c# sqldatareader datareader


【解决方案1】:

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

来自

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

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

【讨论】:

    【解决方案2】:

    请尝试使用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();
            }
        }
     }  
    

    这样,当您从阅读器读取数据时,连接会保持打开状态。这对于避免错误至关重要。

    更重要的一点是,您不必担心在不再需要时关闭和处置连接。退出 using 块关闭并处理连接、命令和阅读器 ALSO 以防出现异常。

    【讨论】:

    • 是的@GrantWinney 搬家了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多