本帖最后由 ainiak110 于 2012-11-28 09:28:52 编辑

解决方案 »

  1.   

    cmd=new SqlCommand("select Name from Book", con); //重新实例一个cmd            
    SqlDataReader reader = null;
    ....
      

  2.   

    不要使用公共变量 SqlConnection con; 使用两个变量试试。
      

  3.   

    在reader的过程中是不能改变cmd的
      

  4.   


    要在那里加个
    finally
                {
                    if (con != null && con.State != ConnectionState.Closed)
                        con.Close();
                }用的时候再打开么
      

  5.   

    建议声明的 SqlDataReader reader = null;这个对象的名字和上面的不一致试下,也许LOAD的时候,变量是这个,再次执行的时候,内存中的对象分不清楚了。你试下,行的话告诉我。
      

  6.   

    1、reader跟cmOrder两个对象不要共用一个Connection对象。
    2、不要在while代码段内执行reader.Close();语句。否则继续执行while代码段内语句会报“阅读器关闭时尝试调用 Read 无效。”错误提示。1、主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。 2、或许有朋友会问,我在语句中并未使用 DataReader,未何也提示同样的错误,这个DataReader隐藏在哪里,我给大家在这里指出来,由于本人研究的还不够深入,只知道有一种方法的调用后会生成 DataReader,我想这也是绝大多数人遇到头疼的问题。     在使用数据库更新或插入语句时,大家通常使用 SqlCommand 的 ExecuteNonQuery() 方法,并且前提是定义了一个公共的数据库连接(如果每次查询时都生成新连接的话不会存在这个问题,但那样数据库占用的资源相对会高很多),在ExecuteNonQuery() 后,内部会生成一个空的 DataReader 对象,并当当前的数据库连接关闭掉后,该 DataReader 才会释放。因此在大家使用更新方法时,推荐使用 using 关键字,它作为语句,可以将它所定义范围内的对象都释放掉。
      

  7.   


    我改成这样也不行                 SqlDataReader reader = cmd.ExecuteReader();
      

  8.   


    我上一个 reader  关闭了的。我晕死
      

  9.   


    在ExecuteNonQuery() 后,内部会生成一个空的 DataReader 对象,并当当前的数据库连接关闭掉后