我遇到了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());
}
}
答案 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();
}
}
}
通过这种方式,当您从阅读器中读取时,连接保持打开状态。这对于避免错误至关重要。
更重要的一点是,您不必担心在不再需要时关闭并处理连接。从使用块的退出关闭并处理连接,命令和读取器也是例外情况。