用递归生成一个treeView,数据库超时,大家帮忙看看该怎么办啊?

zhjzh_zjz 2006-06-20 06:59:30
我的数据库设计是:
menuid text url refid
menuid存放菜单编号,text存放菜单显示的文字,url是他的目标地址,refid是它父菜单的编号

大家看看我的程序该怎么改才行呢?

protected SqlDataReader getMenuReader(string fatherID) {
StringBuilder sqlStr = new StringBuilder();
if (string.Empty.Equals(fatherID.ToString()))
sqlStr.Append("select Text,url,pageId, MenuId from exjmenu where refmenuid is null");
else
sqlStr.Append ( "select Text,url,pageId,MenuId from exjmenu where refmenuid=" + Convert.ToString ( fatherID ) );
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["gyweb"].ToString());
SqlCommand command = new SqlCommand(sqlStr.ToString(), conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}

protected void myGetNode(string fatherID, TreeNode rootNode)
{
SqlDataReader myReader = getMenuReader(fatherID);
while (myReader.Read())
{
TreeNode newNode = new TreeNode();
newNode.Text = myReader[0].ToString();
newNode.NavigateUrl = myReader[1].ToString()+"?pageid="+myReader[2];
newNode.Target = "ifr";
if (getMenuReader(myReader[2].ToString()).Read()) myGetNode(myReader[2].ToString(), newNode);
rootNode.ChildNodes.Add(newNode);
}
myReader.Close ( );
myReader.Dispose ( );
}

这个程序开始用得好好的,今天下午突然就不行了,老是显示
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

我一看SQL Server后台,一共开有299个进程。不知道怎么改才行。大虾帮忙指点一下
...全文
201 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂秀才2018 2006-06-20
  • 打赏
  • 举报
回复
偶不用DATAREADER,我一般先将数据放到DATASET里,然后用DATAVIEW 和FOREACH循环

public DataTable GetTreeNodeTable()
{
SqlConnection conn=new SqlConnection("....");
string cmdText="........";
SqlDataAdapter cmd=new SqlDataAdapter(cmdText,conn);
DataSet ds=new DataSet();
return ds.Tables[0];
}

public void inittree(TreeNode rootNode,string parentid)
{
DataView dv=new DataView();
dv.Table=GetTreeNodeTable();
dv.RowFilter="parentid="+parentid;
TreeNode tn;
foreach(DataRowView drv in dv)
{
tn=new TreeNode();
tn.ID=drv["id"].ToString();
tn.Text=drv["xxxx"].ToString();
rootnode.nodes.add(tn);
.
.其它treenode 属性,偶就省略了
.
.
inittree(tn,tn.id);
}
}
zhjzh_zjz 2006-06-20
  • 打赏
  • 举报
回复
还是不行呢,老大。
我改成了
private SqlConnection conn = new SqlConnection ( ConfigurationManager.ConnectionStrings [ "gyweb" ].ToString ( ) );

protected SqlDataReader getMenuReader(string fatherID) {
StringBuilder sqlStr = new StringBuilder();
if (string.Empty.Equals(fatherID.ToString()))
sqlStr.Append("select Text,templePage,pageId, MenuId from exjmenu where refmenuid is null");
else
sqlStr.Append ( "select Text,templePage,pageId,MenuId from exjmenu where refmenuid=" + Convert.ToString ( fatherID ) );
SqlCommand command = new SqlCommand(sqlStr.ToString(), conn);
if ( conn.State.ToString().ToLower().Equals("closed") )
conn.Open ( );
SqlDataReader reader = command.ExecuteReader();
return reader;
}

protected void myGetNode(string fatherID, TreeNode rootNode)
{
SqlDataReader myReader = getMenuReader(fatherID);
while (myReader.Read())
{
TreeNode newNode = new TreeNode();
newNode.Text = myReader[0].ToString();
newNode.NavigateUrl = myReader[1].ToString()+"?pageid="+myReader[2];//"javascript:alert('Welcome!')";
newNode.Target = "ifr";
if ( getMenuReader ( myReader [ 2 ].ToString ( ) ).Read ( ) ) {
myGetNode ( myReader [ 2 ].ToString ( ) , newNode );
}
rootNode.ChildNodes.Add(newNode);
}
myReader.Close ( );
conn.Close ( );
}


之后报错:

There is already an open DataReader associated with this Command which must be closed first.

麻烦啊,那位大哥知道有什么好的解决办法呢?
include_me 2006-06-20
  • 打赏
  • 举报
回复
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["gyweb"].ToString());

这个不要放到递归里..

每次都重新连..

服务器还能受的了吗?!..

只改变 SqlCommand 就可以...

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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