ADO.net DataReader 被递归调用-> 在新的递归帧的开头不再重新开始
Posted
技术标签:
【中文标题】ADO.net DataReader 被递归调用-> 在新的递归帧的开头不再重新开始【英文标题】:ADO.net DataReader is called recursivley -> does not start again at the beginning in new recursive frame 【发布时间】:2015-03-13 16:15:53 【问题描述】:请想象一下这个方法原型:
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] 重新开始,但会以某种方式记住其状态。因此,如果我在第二级阅读器中再次进入此功能,则从它结束的地方开始,在这种情况下从 index[2] 开始。
如何让 DataReader 从头开始? dataReader 是错误的数据结构吗?
非常感谢您的帮助!
【问题讨论】:
DataReader 是“只向前”的,不能返回。 【参考方案1】:是的,结构错误。
使用数据适配器填充 DataTable 并使用该 DataTable 而不是 DataReader。
或者正如 stuartd 指出的,您可以从您的阅读器创建 DataTable:
DataTable dt = new DataTable();
dt.Load(reader);
因此,您可以在 Rows 集合上使用 foreach,而不是 while 循环。
【讨论】:
DataTable 有a Load method which will populate straight from the reader 完美答案!我正是需要这个!非常感谢!以上是关于ADO.net DataReader 被递归调用-> 在新的递归帧的开头不再重新开始的主要内容,如果未能解决你的问题,请参考以下文章