请想象一下这个方法原型:
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]重新开始,但会以某种方式记住其状态。因此,如果我在第二级读者再次进入此函数,则从它结束的位置开始,在这种情况下从索引[2]开始。
如何让DataReader再次从头开始? dataReader是否是错误的数据结构?
非常感谢您的帮助!
答案 0 :(得分:0)
是的,错误的结构。
使用数据适配器填充DataTable并使用该DataTable而不是DataReader。
或者正如stuartd指出的那样,你可以从读者那里创建DataTable:
DataTable dt = new DataTable();
dt.Load(reader);
因此,不是使用while循环,而是在Rows集合上使用foreach。