建立TreeView出错,出错提示:已有打开的与此连接相关联的dATArEADER,必须首先将它关闭

ZXYSOSO 2003-07-28 09:38:46
public static void AddMenuTreeView(TreeView FTreeView)
{
string is_menuid="",is_menuname="";
string is_modelid="",is_modelname="";
SqlCommand MenuModelSql=new SqlCommand("select menuid,menuname from MENUMODEL",DataBaseConnect.ReturnConnectString);
SqlDataReader dr_MenuModel ;
SqlDataReader dr_Menu ;
dr_MenuModel=MenuModelSql.ExecuteReader();
while (dr_MenuModel.Read())
{
is_menuid=dr_MenuModel.GetString(0);is_menuname=dr_MenuModel.GetString(1);
TreeViewNode cRoot=new TreeViewNode(is_menuname);
FTreeView.Nodes.Add(cRoot);
SqlCommand MenuSql=new SqlCommand("select modelid,modelname from view_menu where menuid='"+is_menuid+"'",DataBaseConnect.ReturnConnectString);
dr_Menu=MenuSql.ExecuteReader();
while (dr_Menu.Read())
{
is_modelid=dr_Menu.GetString(0);
is_modelname=dr_Menu.GetString(1);
}

dr_Menu.Close();

}
}

当程序运行到这句时:dr_Menu=MenuSql.ExecuteReader();
出错:已有打开的与此连接相关联的dATArEADER,必须首先将它关闭
...全文
59 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Knight94 2003-07-28
  • 打赏
  • 举报
回复
因为SqlDataReader在Read的时候,连接并没关闭,所以在其中不能再用同一个连接去执行SqlCommand。
因此解决的方法,用SqlDataAdapter来替换SqlDataReader。
ZXYSOSO 2003-07-28
  • 打赏
  • 举报
回复
我现在有点忙,不过测试通过,就给分。
雪狼1234567 2003-07-28
  • 打赏
  • 举报
回复
string is_menuid="",is_menuname="";
string is_modelid="",is_modelname="";
SqlCommand MenuModelSql=new SqlCommand("select menuid,menuname from MENUMODEL",DataBaseConnect.ReturnConnectString);
SqlDataAdapter da = new SqlDataAdapter()
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter()
da.SelectCommand = MenuModelSql;
dataSet dt = new DataSet();
da.Fill(dt,"MENUMODEL")
foreach(DataRow dr in dt.Tables[0].Rows)
{
is_menuid=dr_MenuModel.GetString(0);is_menuname=dr_MenuModel.GetString(1);
TreeViewNode cRoot=new TreeViewNode(is_menuname);
FTreeView.Nodes.Add(cRoot);
SqlCommand MenuSql=new SqlCommand("select modelid,modelname from view_menu where menuid='"+is_menuid+"'",DataBaseConnect.ReturnConnectString);
dr_Menu=MenuSql.ExecuteReader();
while (dr_Menu.Read())
{
is_modelid=dr_Menu.GetString(0);
is_modelname=dr_Menu.GetString(1);
}

dr_Menu.Close();

}
}
下面也换成这样,另取一个DataSet的名字就好:
da.SelectCommand = MenuModelSql;
dataSet dt = new DataSet();
da.Fill(dt,"MENUMODEL")
foreach(DataRow dr in dt.Tables[0].Rows)
{
ZXYSOSO 2003-07-28
  • 打赏
  • 举报
回复
没人回答吗?
ZXYSOSO 2003-07-28
  • 打赏
  • 举报
回复
明白,原来是这样。也就是现在子循环改用DATASET,麻烦《 river168(海阔天空.net) 》帮我改一下好吗?多谢。
river168 2003-07-28
  • 打赏
  • 举报
回复
dr_MenuModel=MenuModelSql.ExecuteReader();
while (dr_MenuModel.Read())
{
dr_Menu=MenuSql.ExecuteReader();
while (dr_Menu.Read())
{

这样嵌套DATAREADER是不行的,因为DATAREADER打开后,没有关闭之前一直会占用CONNECTION的,所以你第二个DATAREADER是不能打开的.换个方法,取出DATASET数据集再进行循环处理.
ZXYSOSO 2003-07-28
  • 打赏
  • 举报
回复
ok
ZXYSOSO 2003-07-28
  • 打赏
  • 举报
回复
搞好啦,大家都有分

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧