下面是我用sqldataadapter和sqldatareader一起使用,但是执行的时候提示下面的错误,
{System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。这些是我写的代码
        SqlDataAdapter adapter = new SqlDataAdapter();
        SqlDataReader dr;
        string connectionString = ConfigurationManager.ConnectionStrings["CRCS_ConnnectionString"].ConnectionString;
        SqlConnection connection = new SqlConnection(connectionString);
        try
        {
            connection.Open();
            adapter.SelectCommand = new SqlCommand("Ownn_GetResourceName", connection);
            adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            dr = adapter.SelectCommand.ExecuteReader();
            string[] typeid = type.Split(new char[] { ',' });
            while (dr.Read())
            {              
                for (int i = 0; i < typeid.Length; i++)
                {
                    if (dr["ID"].ToString() == typeid[i].ToString())
                    {               
                        DataTable tb = new DataTable();
                        adapter.Fill(tb);
                        this.ResourceType.DataSource = tb;
                        this.ResourceType.DataBind();
                    }
              }
 
            }
           
        }
       

解决方案 »

  1.   

    你的sqldatareader经以打开了数据库连接,必须将它关闭。才可以用DataAdapter进行数据集填充。
      

  2.   

    上面的代码如果关闭sqldatareader就不能循环读取出来了.有什么更好的办法?
      

  3.   

    在内循环里重新建立一个新的SqlConnection试试
      

  4.   

    上面的代码如果关闭sqldatareader就不能循环读取出来了.有什么更好的办法?
    ------------------------------------------------------------------
    用dataset
      

  5.   

    下面是我改成DATASET的,但是不 知道那里用的不对还是提示同样子的问题,请指点
    while (dr.Read())
                {               
                    for (int i = 0; i < typeid.Length; i++)
                    {
                        if (dr["ID"].ToString() == typeid[i].ToString())
                        {                  
                            DataSet set = new DataSet();                        
                            adapter.Fill(set);
                            this.ResourceType.DataSource = set.Tables[0];
                            this.ResourceType.DataBind();
                        }                   
                    } 
                }           
      

  6.   

    晕,他们是要你把外层的datareader换成dataset
      

  7.   

    我不知道DataSet和SqldataAdapter怎么样,如果换成DataSet那如何循环?
      SqlDataAdapter adapter = new SqlDataAdapter();
            DataSet set = new DataSet();
            string connectionString = ConfigurationManager.ConnectionStrings["CRCS_ConnnectionString"].ConnectionString;
            SqlConnection connection = new SqlConnection(connectionString);
            try
            {
                connection.Open();
                adapter.SelectCommand = new SqlCommand("Ownn_GetResourceName", connection);
                adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
                //dr = adapter.SelectCommand.ExecuteReader();
                adapter.Fill(set);
                string[] typeid = type.Split(new char[] { ',' });
                while (dr.Read())-----这里的循环应该怎么样来实现?
                {               
                    for (int i = 0; i < typeid.Length; i++)
                    {
                        if (dr["ID"].ToString() == typeid[i].ToString())
                        {                  
                            DataTable tb = new DataTable();                        
                            adapter.Fill(tb);
                            this.ResourceType.DataSource = tb;
                            this.ResourceType.DataBind();
                        }                   
                    } 
      

  8.   

    上面的问题基本已经明白,但是现在这个循环的判断不启作用,我只想让相等的读取出来,但是现在所有的都读取出来了.
      for (int j = 0; j < set.Tables[0].Rows.Count; j++)
                {
                    for (int i = 0; i < typeid.Length; i++)
                    {                  
                        DataTable tb = set.Tables[0];
                        
                        if (typeid[i].ToString() == set.Tables[0].Rows[j]["ID"].ToString())
                        {
    this.ResourceType.DataSource = tb;
                        this.ResourceType.DataBind();
                        }
                    }
                }