>请想象这个方法原型:
protected void getChildren(int parentIdeaIdentifier, OleDbDataReader reader, ref string result, int level)
调用例如getChildren(331,读者,"空",0);
假设读取器 (OleDbDataReader) 具有以下简化的 4 个条目:
[0]: reader["Idea_ID"]: "148"
[1]: reader["Idea_ID"]: "72"
[2]: reader["Idea_ID"]: "331"
[3]: reader["Idea_ID"]: "331"
所以现在请看一下这个小的递归方法:
protected void getChildren(int parentIdeaIdentifier, OleDbDataReader reader, ref string parentAndChildren, int level)
{
while (reader.Read()) //4 times in our case
{
if (Convert.ToInt32(reader["Parent_Idea_Identifier"].ToString()) == parentIdeaIdentifier)
{
ideaIdentifier = Convert.ToInt32(reader["Idea_Identifier"].ToString());
//parentAndChildren = "do something";
getChildren(ideaIdentifier, reader, ref parentAndChildren, level - 1);
}
else
continue;
}
}
这并不重要,你了解这种方法的作用!但问题来了:
如果第一次输入函数,则 while 循环总共循环 4 次。操作仅当读取器为 331 时才会完成!如果是 331,则使用不同的参数再次递归调用此函数。
问题:此 DataReader 不会从索引 [0] 重新启动,而是以某种方式记住其状态。因此,如果我在第二级阅读器中再次进入此函数,则从它结束的地方开始,在本例中从 index[2] 开始。
如何使数据读取器重新开始?dataReader 是错误的数据结构吗?
非常感谢您的帮助!
是的,结构错误。
使用数据适配器填充数据表,并使用该数据表而不是数据读取器。
或者正如 stuartd 指出的那样,您可以从阅读器创建 DataTable:
DataTable dt = new DataTable();
dt.Load(reader);
因此,您将在 Rows 集合上使用 foreach 而不是 while 循环。