1

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

protected void getChildren(int parentIdeaIdentifier, OleDbDataReader reader, ref string result, int level)

调用例如 getChildren(331, reader, "empty", 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 是错误的数据结构吗?

非常感谢您的帮助!

4

1 回答 1

0

是的,结构错误。

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

或者正如 stuartd 指出的那样,您可以从您的阅读器创建 DataTable:

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

因此,您可以在 Rows 集合上使用 foreach 来代替 while 循环。

于 2015-03-13T16:35:39.900 回答