当读取器关闭时,我有一个错误无效的尝试调用Metadeta。我的代码如下所示。我需要一个解决方案。 [英] I Have An Error Invalid Attempt To Call Metadeta When Reader Is Closed. My Code Is Shown Below. I Need An Solution Please.

查看:72
本文介绍了当读取器关闭时,我有一个错误无效的尝试调用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆