一个按钮的点击功能
protected void delete_rz_Click(object sender, EventArgs e)
    {        
        for (int i = 0; i < rz_show.Rows.Count; i++)
        {
            SqlDataReader dr = cmd1.ExecuteReader();
            dr.Read();
            int logid = Convert.ToInt32(dr["log_ID"]);
            CheckBox ckbox = (CheckBox)rz_show.Rows[i].FindControl("check_id");
            if (ckbox.Checked)
            {
                SqlCommand cmd2 = new SqlCommand("Delete from Content where log_ID='" + logid + "'", conn);
                cmd2.ExecuteNonQuery();
            }
            dr.Close();
        }
        
    }
然后当我点击的时候就会报错:
已有打开的与此命令相关联的 DataReader,必须首先将它关闭我尝试了SqlDataReader dr = cmd1.ExecuteReader();放for上面
或者dr.Close();放for外面都是这个错误应该怎么写呢??

解决方案 »

  1.   

    我的页面中就这么一个SqlDataReader,点击按钮的时候才出现这个错误
      

  2.   

    SqlDataReader 要先关闭,再执行ExecuteNonQuery操作
    dr.Read();
     int logid = Convert.ToInt32(dr["log_ID"]);
    dr.Close();

    SqlConnection con2 = new SqlConnection("");
    SqlCommand cmd2 = new SqlCommand("", con2);
    cmd2.ExecuteNonQuery();
      

  3.   

    cmd1是哪里来的 它的连接对象是不是cmd2的那个conn??
    错误不是出在"dr.Close();"
    而是连接对象conn的打开与关闭
      

  4.   

    SqlServer2005提供一个新特性mars 把连接字符串的mars(这个是简拼全称去查查)设置成true之后 用这个连接字符串构建的conn对象就可以在打开一次之后执行多个命令 最后再关闭了 
    显然你这里还不行
      

  5.   


    这个方法解决了刚才的问题,
    现在有新问题了,
     SqlDataReader dr = cmd1.ExecuteReader();
            for (int i = 0; i < rz_show.Rows.Count; i++)
            {
                
                dr.Read();
                int logid = Convert.ToInt32(dr["log_ID"]);
                dr.Close();
                ……
    我想在循环的时候一条一条读下去,可是循环第2次他就报错“阅读器关闭时尝试调用 Read 无效”
    SqlDataReader dr = cmd1.ExecuteReader();放for里面可以的,但是这样永远读的是第一条记录
    怎么解决这个问题呢?
      

  6.   

    像那种while(dr.Read())
    这种循环为什么不会出现
    “已有打开的与此命令相关联的 DataReader,必须首先将它关闭”
    循环一直在使用Read()
      

  7.   

    如果你是这样的话,用人生如梦的第二种方法,就是dr.Close()放在循环的外面,里面的cmd2的连接对象conn别和上面的cmd1的连接对象是同一个,只要另实例化一个连接对象给cmd2就行了!
      

  8.   

    我尝试了下用了个新的conn2给了cmd2真的成功了
    非常感谢!