ADO.net DataReader被称为recursivley - >在新的递归框架中不会在开头重新开始

时间:2015-03-13 16:15:53

标签: c# recursion ado.net oledbdatareader

请想象一下这个方法原型:

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是否是错误的数据结构?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

是的,错误的结构。

使用数据适配器填充DataTable并使用该DataTable而不是DataReader。

或者正如stuartd指出的那样,你可以从读者那里创建DataTable:

DataTable dt = new DataTable();
dt.Load(reader);

因此,不是使用while循环,而是在Rows集合上使用foreach。