c#mysql - 已经有一个与此连接关联的打开的datareader,必须先关闭它

时间:2014-07-26 11:01:24

标签: c# mysql

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,必须先关闭”。   请帮帮我们......

5 个答案:

答案 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),我忘记了分号';'在查询语句的末尾。我放回去后,错误消失了。