c#中已经有一个与此连接相关的打开的数据读取器,必须先关闭它
本文关键字:读取 数据 有一个 连接 | 更新日期: 2023-09-27 18:15:11
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,而不是像代码中那样相反。声明一个新的数据读取器和一个新的命令。反:
dr.Close ();conn.Close ();
修改你的代码:
<>之前private void populateTreeView(TreeView tv){试一试{字符串查询= "select * from year_grade order by sort asc";cmd = new MySqlCommand(查询,conn);dr = cmd.ExecuteReader();String query1 = ";而(dr.Read ()){TreeNode节点= 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();而(dr2.Read ()){node.Nodes.Add (dr2 [" stud_year "] .ToString ());tv.Nodes.Add(节点);}dr2.Close ();}
dr.Close();
conn.Close();
}
catch (Exception n)
{
Console.Write(n.Message);
MessageBox.Show(n.Message);
}
之前}
你需要为内循环定义一个新的DataReader,因为之前的reader已经打开了
错误信息暗示连接一次只允许一个活动读取器。如果这是SQL Server,则需要在连接字符串中包含MultipleActiveResultSets=True
。对于MySQL,你需要做任何等价的事情(假设它支持这个特性)。
在我的情况下(dapper + mysql),我忘记在查询语句结束时放分号';'。
声明一个数据集并用"select * from stud_year "填充;
在你的内部循环过滤器中,它是datatable with "year_grade='" + dr["year_grade"] + "' ";然后循环它的row
看起来好多了