C#中, 对数据库的操作,使用递归调用出错(出错信息为OleDbCommand是当前正忙的Open,Fectching。) ( 积分: 15 )

  • 主题发起人 主题发起人 mycwcgr_new
  • 开始时间 开始时间
M

mycwcgr_new

Unregistered / Unconfirmed
GUEST, unregistred user!
C#中, 对数据库的操作,使用递归调用出错(出错信息为OleDbCommand是当前正忙的Open,Fectching。)
下面的程序,NewQueryNode是一个递归调用,出错信息为OleDbCommand是当前正忙的Open,Fectching。
我猜想是由于在递归调用时,有些变量如reader没有执行reader.Close()靠造成的。
不过我仍然非常奇怪:按理,每次递归调用NewQueryNode,它使用新的内存空间,变量之间应互不干扰啊!!

public void NewFillTree(int userID,int parentID) //临时放在此处用于测试目的
{
try
{
ConstClass.databaseConnect.Open();
//打开Access数据库连接
OleDbCommand myCommand=new OleDbCommand();
myCommand.Connection=ConstClass.databaseConnect;
NewQueryNode(myCommand,userID,parentID);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{

ConstClass.databaseConnect.Close();
}
}


private void NewQueryNode(OleDbCommand myCommand,int userID,int rootID) //临时放在此处用于测试目的
{

myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
OleDbDataReader reader=myCommand.ExecuteReader();

while (reader.Read())
{
MessageBox.Show(reader["Name"].ToString());
rootID=int.Parse(reader["NodeID"].ToString());
NewQueryNode(myCommand,userID,rootID);
//递归调用
}
reader.Close();

}

当我将程序作如下改动时,中间过程MessageBox.Show(reader["Name"].ToString());的执行正常,但在程序结束时显示错误“阅读器关闭时Read的尝试无效”

private void NewQueryNode(OleDbCommand myCommand,int userID,int rootID) //临时放在此处用于测试目的
{

myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
OleDbDataReader reader=myCommand.ExecuteReader();

while (reader.Read())
{
MessageBox.Show(reader["Name"].ToString());
rootID=int.Parse(reader["NodeID"].ToString());
reader.Close();
//加了一行
NewQueryNode(myCommand,userID,rootID);
}

}

 
C#中, 对数据库的操作,使用递归调用出错(出错信息为OleDbCommand是当前正忙的Open,Fectching。)
下面的程序,NewQueryNode是一个递归调用,出错信息为OleDbCommand是当前正忙的Open,Fectching。
我猜想是由于在递归调用时,有些变量如reader没有执行reader.Close()靠造成的。
不过我仍然非常奇怪:按理,每次递归调用NewQueryNode,它使用新的内存空间,变量之间应互不干扰啊!!

public void NewFillTree(int userID,int parentID) //临时放在此处用于测试目的
{
try
{
ConstClass.databaseConnect.Open();
//打开Access数据库连接
OleDbCommand myCommand=new OleDbCommand();
myCommand.Connection=ConstClass.databaseConnect;
NewQueryNode(myCommand,userID,parentID);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{

ConstClass.databaseConnect.Close();
}
}


private void NewQueryNode(OleDbCommand myCommand,int userID,int rootID) //临时放在此处用于测试目的
{

myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
OleDbDataReader reader=myCommand.ExecuteReader();

while (reader.Read())
{
MessageBox.Show(reader["Name"].ToString());
rootID=int.Parse(reader["NodeID"].ToString());
NewQueryNode(myCommand,userID,rootID);
//递归调用
}
reader.Close();

}

当我将程序作如下改动时,中间过程MessageBox.Show(reader["Name"].ToString());的执行正常,但在程序结束时显示错误“阅读器关闭时Read的尝试无效”

private void NewQueryNode(OleDbCommand myCommand,int userID,int rootID) //临时放在此处用于测试目的
{

myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
OleDbDataReader reader=myCommand.ExecuteReader();

while (reader.Read())
{
MessageBox.Show(reader["Name"].ToString());
rootID=int.Parse(reader["NodeID"].ToString());
reader.Close();
//加了一行
NewQueryNode(myCommand,userID,rootID);
}

}

 
下面的递补归算法中, 在调用QueryNode(myCommand,userID,rootID);之前,必须加上reader.Close()语句,
我非常奇怪,reader是一个局部变量,再次调用OleDbDataReader reader=myCommand.ExecuteReader()时,应该
重新初始,不应该出现错误“ExecuteReader需要打开的并且可用的连接,该连接的当前状态是Open,Fetching”啊!!!
private void QueryNode(OleDbCommand myCommand,int userID,int rootID) //临时放在此处用于测试目的
{
myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
OleDbDataReader reader=myCommand.ExecuteReader();


while (reader.Read())
{
MessageBox.Show(reader["Name"].ToString());
rootID=int.Parse(reader["NodeID"].ToString());
int youngerID=int.Parse(reader["YoungerBrotherID"].ToString());
reader.Close();
myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
reader=myCommand.ExecuteReader();
if (reader.Read())
{
reader.Close();
//不加这一句,显示错误“ExecuteReader需要打开的并且可用的连接,该连接的当前状态是Open,Fetching”
QueryNode(myCommand,userID,rootID);
}
reader.Close();
myCommand.CommandText="select * from categorytable where UserID="+userID
+" and NodeID="+youngerID;
reader=myCommand.ExecuteReader();
}
reader.Close();

}

public void FillTree(int userID,int parentID) //临时放在此处用于测试目的
{
try
{
ConstClass.databaseConnect.Open();
OleDbCommand myCommand=new OleDbCommand();
myCommand.Connection=ConstClass.databaseConnect;
QueryNode(myCommand,userID,parentID);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
ConstClass.databaseConnect.Close();
}
}


我将OleDbCommand myCommand变为局部变量,仍然出现同样的错误!!!!!!!!

private void QueryNode(int userID,int rootID) //临时放在此处用于测试目的
{
OleDbCommand myCommand=new OleDbCommand();
myCommand.Connection=ConstClass.databaseConnect;
myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
OleDbDataReader reader=myCommand.ExecuteReader();

while (reader.Read())
{
MessageBox.Show(reader["Name"].ToString());
rootID=int.Parse(reader["NodeID"].ToString());
int youngerID=int.Parse(reader["YoungerBrotherID"].ToString());
reader.Close();
myCommand.CommandText="select * from categorytable where UserID="+userID
+" and ParentID="+rootID
+" and ElderBrotherID=0";
reader=myCommand.ExecuteReader();
if (reader.Read())
{
reader.Close();
//不加这一句,显示错误“ExecuteReader需要打开的并且可用的连接,该连接的当前状态是Open,Fetching”
QueryNode(userID,rootID);
}
reader.Close();
myCommand.CommandText="select * from categorytable where UserID="+userID
+" and NodeID="+youngerID;
reader=myCommand.ExecuteReader();
}
reader.Close();

}





 
reader 没有close 就直接用同一个sqlcommand 打开另外一个reader ,估计问题就是出在这里.
建议你不要使用这种写法,这样同时打开的数据库连接很多,有可能并发连接达到最大值,从而操作失败,而且性能也很差
 
To yongwc,
但是我将OleDbCommand myCommand变为局部变量,仍然出现同样的错误!!!!!!!!
你认为如何做好?
 
那应该是因为并发连接过多的导致的问题,
你试一下将树的节点减少到10个以下,看是否还存在问题,如果不存在,则肯定是并发连接数达到上限引起
 
To yongwc,
节点减少到10个以下,仍然出现同样的错误
 
这样的递归,可以先使用一个集合存储这一层所读出来的数据,关闭reader,再逐个进行下一层调用。
每个reader在关闭以前,都会一直占用连接,所以这个连接不能再执行command组件的executereader方法了。
 
多人接受答案了。
 
后退
顶部