private void populateTreeView(TreeView tv)
{
try
{
String query = "select * from year_grade order by sort asc";
cmd = new MySqlCommand(query, conn);
dr = cmd.ExecuteReader();
String query1 = "";
while (dr.Read())
{
TreeNode node = new TreeNode(dr["year_grade"].ToString());
query1 = "select * from stud_year where year_grade='" + dr["year_grade"] + "' ";
cmd1 = new MySqlCommand(query1, conn);
dr = cmd1.ExecuteReader();
while (dr.Read())
{
node.Nodes.Add(dr["stud_year"].ToString());
tv.Nodes.Add(node);
}
}
conn.Close();
dr.Close();
}
catch (Exception n)
{
Console.Write(n.Message);
MessageBox.Show(n.Message);
}
}
此代码有什么问题。来自catch块的消息框说“已经有一个与此连接关联的打开的datareader,必须先关闭”。 请帮帮我们......
答案 0 :(得分:0)
让它在连接之前关闭Datareader,而不是在代码中反转。也声明一个新的datareader和一个新命令。
反转这个:
dr.Close();
conn.Close();
使用以下代码更改您的代码:
private void populateTreeView(TreeView tv)
{
try
{
String query = "select * from year_grade order by sort asc";
cmd = new MySqlCommand(query, conn);
dr = cmd.ExecuteReader();
String query1 = "";
while (dr.Read())
{
TreeNode node = new TreeNode(dr["year_grade"].ToString());
query1 = "select * from stud_year where year_grade='" + dr["year_grade"] + "' ";
cmd2 = new MySqlCommand(query1, conn);
dr2 = cmd2.ExecuteReader();
while (dr2.Read())
{
node.Nodes.Add(dr2["stud_year"].ToString());
tv.Nodes.Add(node);
}
dr2.Close();
}
dr.Close();
conn.Close();
}
catch (Exception n)
{
Console.Write(n.Message);
MessageBox.Show(n.Message);
}
}
答案 1 :(得分:0)
你需要为内部循环定义一个新的DataReader,因为之前的读者已经打开了。
答案 2 :(得分:0)
错误消息表示连接一次只允许一个活动的阅读器。如果这是SQL Server,则需要在连接字符串中包含MultipleActiveResultSets=True
。对于MySQL,您需要做相同的事情(假设它支持此功能)。
答案 3 :(得分:0)
声明一个数据集并用" select * from stud_year&#34 ;;
填充它在你的内环中过滤它的数据表" year_grade ='" +博士[" year_grade"] +"' &#34 ;; 并遍历它的行
似乎更好
答案 4 :(得分:0)
在我的情况下(精简版+ mysql),我忘记了分号';'在查询语句的末尾。我放回去后,错误消失了。