当读取器关闭时,我有一个错误无效的尝试调用Metadeta。我的代码如下所示。我需要一个解决方案。 [英] I Have An Error Invalid Attempt To Call Metadeta When Reader Is Closed. My Code Is Shown Below. I Need An Solution Please.
本文介绍了当读取器关闭时,我有一个错误无效的尝试调用Metadeta。我的代码如下所示。我需要一个解决方案。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Honey;Integrated Security=True");
con.Open();
string sg = "CCA1012".ToString();
SqlCommand cmd = new SqlCommand("select AgentID,Name from agentregistration",con);
SqlDataReader dr = cmd.ExecuteReader();
cmd.Dispose();
string[,] parentnode = new string[100, 2];
int count = 0;
while (dr.Read())
{
parentnode[count, 0] = dr.GetValue(dr.GetOrdinal("AgentID")).ToString();
parentnode[count++, 1] = dr.GetValue(dr.GetOrdinal("Name")).ToString();
}
dr.Close();
for (int loop = 0; loop < count; loop++)
{
TreeNode root = new TreeNode();
root.Text = parentnode[loop, 1];
root.Target = "blank";
root.NavigateUrl = "Default5.aspx";
SqlCommand cmd1 = new SqlCommand("select SponsorID from agentregistration where SponsorID=" + parentnode[loop, 0], con);
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
TreeNode child = new TreeNode();
child.Text = dr1.GetValue(dr.GetOrdinal("SponsorID")).ToString();
child.Target = "blank";
child.NavigateUrl = "Default5.aspx";
root.ChildNodes.Add(child);
sg = child.Value;
}
dr1.Close();
TreeView1.Nodes.Add(root);
}
TreeView1.CollapseAll();
con.Close();
}
}
推荐答案
简单:
Simple:
SqlDataReader dr = cmd.ExecuteReader();
cmd.Dispose();
...
while (dr.Read())
{
...
}
dr.Close();
for (int loop = 0; loop < count; loop++)
{
...
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
...
child.Text = dr1.GetValue(dr.GetOrdinal("SponsorID")).ToString();
...
}
您不能在第二个 dr
内使用 while
:当你完成上面的操作后,你已经关闭了它。您的意思是 dr1
吗?
即:
You can't use dr
inside the second while
: you already closed it when you finished with it above. Did you mean dr1
instead?
I.e.:
child.Text = dr1.GetValue(dr.GetOrdinal("SponsorID")).ToString();
成为:
becomes:
child.Text = dr1.GetValue(dr1.GetOrdinal("SponsorID")).ToString();
而不是使用手动Dispose,最好使用使用
块 - 它将变量超出范围好吧,这意味着你不能像编译器抱怨那样犯这个错误!
[/ Edit]
Instead of using manual Dispose, it's a good idea to use a using
block instead - it takes the variable out of scope as well, which means you can't make this mistake as teh compiler complains!
[/Edit]
这篇关于当读取器关闭时,我有一个错误无效的尝试调用Metadeta。我的代码如下所示。我需要一个解决方案。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文