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

本文关键字:读取 无效 调用 | 更新日期: 2023-09-27 18:32:37

我在使用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();
    }

这是删除结果的构造函数

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

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

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

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

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

请尝试使用 using 语句,将连接、命令和读取器正确括在适当的块中。

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

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

更重要的一点是,您不必担心在不再需要连接时关闭和处置连接。从使用块的退出也会关闭并释放连接、命令和读取器,以防出现异常。