ADO.net DataReader 称为递归 ->在新递归帧中不会在开头重新开始



>请想象这个方法原型:

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 循环。

相关内容

  • 没有找到相关文章

最新更新