[英]DataReader exception in C#
Let me first explain my code. 首先让我解释一下我的代码。
My problem is while running, I get this error: 我的问题是在运行时,出现此错误:
There is already an open DataReader associated with this Command which must be closed first. 已经有一个与此命令相关联的打开的DataReader,必须先关闭它。
How can I handle more than one DataReader
accessing different tables? 如何处理多个DataReader
访问不同的表? Is DataReader
similar to resultset in Java ? DataReader
是否类似于Java中的结果集?
I'm a beginner in coding. 我是编码的初学者。
string id,
destin, num;
id = txt_id.Text;
destin = cb_destin.Text;
num = cb_num.Text;
string sql1 = "SELECT fare FROM route_info WHERE route_name='" +destin + "' ";
string sql2 = "SELECT * FROM trav_acc WHERE user_id='" + id + "'";
con.Open();
cmd1 = new SqlCommand(sql1, con);
reader1 = cmd1.ExecuteReader();
while(reader1.Read())
{
string fare = (string)reader1["fare"];
cmd2 = new SqlCommand(sql2, con);
reader2 = cmd2.ExecuteReader();
string cur_bal = (string)reader2["cur_bal"];
reader2.Close();
string calc1 = "INSERT INTO calc_tb VALUES('" + cur_bal + "','" + num + "','" + fare + "')";
string calc2 = "SELECT cur_bal - (nof_tickets * fare) AS new_bal FROM calc_tb";
cmd3 = new SqlCommand(calc1, con);
cmd3.ExecuteNonQuery();
cmd4 = new SqlCommand(calc2, con);
reader3 = cmd4.ExecuteReader();
while(reader3.Read())
{
string new_bal = (string)reader3["new_bal"];
string update = "UPDATE trav_acc SET cur_bal='" + new_bal + "',last_bal='" + cur_bal + "' WHERE user_id='" + id + "' ";
cmd5 = new SqlCommand(update, con);
cmd5.ExecuteNonQuery();
string clear = "DELETE FROM calc_tb";
cmd6 = new SqlCommand(clear, con);
cmd6.ExecuteNonQuery();
}
}
con.Close();
MessageBox.Show("Thank you for using EasyTravel.Come again soon!");
}
It seems that reader3
and cmd4
are defined outside of the code you are showing us, but at least they are defined outside the loop for reader1
. 似乎reader3
和cmd4
是在您向我们展示的代码之外定义的,但是至少它们是在reader1
的循环之外定义的。 So if your reader1
contains more than one row, reader3
and cmd4
will be assigned again, but the "old" reader3
is never closed. 因此,如果您的reader1
包含多个行, reader3
再次分配reader3
和cmd4
,但是永远不会关闭“旧” reader3
。 Close reader3
when it's finished reading. 完成阅读后,关闭reader3
。 Or use a using
statement, which will take care of the closing automatically. 或使用using
语句,该语句将自动完成关闭。
using (DataReader reader1 = cmd1.ExecuteReader()) {
....
while (reader1.Read()) {
....
using (DataReader reader3 = cmd4.ExecuteReader()) {
while (reader3.Read()) {
}
} //reader3 is closed here automatically
}
} //reader1 is closed here automatically
Furthermore, I'm not sure if I remember correctly, but I think it's not possible to have two open readers on the same connection. 此外,我不确定我是否记错了,但是我认为不可能在同一连接上有两个打开的阅读器。 I may be wrong with this, though. 不过,我可能是错的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.