ADO.net DataReader 被递归调用 -> 不会在新的递归框架的开头再次启动
ADO.net DataReader is called recursivley -> does not start again at the beginning in new recursive frame
请想象一下这个方法原型:
protected void getChildren(int parentIdeaIdentifier, OleDbDataReader reader, ref string result, int level)
电话是getChildren(331, reader, "empty", 0);
假设 reader (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次。
操作仅在例如如果 reader 是 331!
如果是 331,将使用不同的参数再次递归调用此函数。
问题:
此 DataReader 不会再次从索引 [0] 开始,但会以某种方式记住其状态。因此,如果我在第 2 级再次进入此函数,reader 从它结束的地方开始,在本例中是从 index[2].
如何让 DataReader 重新从头开始?
dataReader 是错误的数据结构吗?
非常感谢您的帮助!
是的,结构错误。
使用数据适配器填充 DataTable 并使用该 DataTable 而不是您的 DataReader。
或者正如 stuartd 指出的那样,您可以从 reader:
创建 DataTable
DataTable dt = new DataTable();
dt.Load(reader);
因此,您可以在 Rows 集合上使用 foreach,而不是 while 循环。
请想象一下这个方法原型:
protected void getChildren(int parentIdeaIdentifier, OleDbDataReader reader, ref string result, int level)
电话是getChildren(331, reader, "empty", 0);
假设 reader (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次。 操作仅在例如如果 reader 是 331! 如果是 331,将使用不同的参数再次递归调用此函数。
问题: 此 DataReader 不会再次从索引 [0] 开始,但会以某种方式记住其状态。因此,如果我在第 2 级再次进入此函数,reader 从它结束的地方开始,在本例中是从 index[2].
如何让 DataReader 重新从头开始? dataReader 是错误的数据结构吗?
非常感谢您的帮助!
是的,结构错误。
使用数据适配器填充 DataTable 并使用该 DataTable 而不是您的 DataReader。
或者正如 stuartd 指出的那样,您可以从 reader:
创建 DataTableDataTable dt = new DataTable();
dt.Load(reader);
因此,您可以在 Rows 集合上使用 foreach,而不是 while 循环。