已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
请问如何解决呢,这个执行过程的代码是放在一个循环体内,循环到快完的时候就出来错误。
public int exep_getrecord(string spstr,string macno,int mactype,string empno,int verifymode,int dwinoutmode,string date,string time,int workcode)
        {
            int ret = 0;
            try
            {
                string connectionString = Properties.Settings.Default.standConnectionString.ToString();
                SqlConnection conpro = new SqlConnection(connectionString);               
                //con.ConnectionTimeout = 0;
                SqlDataAdapter da = new SqlDataAdapter();
                using(da.SelectCommand = new SqlCommand());
                da.SelectCommand.Connection = conpro;
                da.SelectCommand.CommandText = spstr;
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.Add(new SqlParameter("@macno", macno));
                da.SelectCommand.Parameters.Add(new SqlParameter("@mactype", mactype));
                da.SelectCommand.Parameters.Add(new SqlParameter("@dwenrollnumber", empno));
                da.SelectCommand.Parameters.Add(new SqlParameter("dwverifymode", verifymode));
                da.SelectCommand.Parameters.Add(new SqlParameter("dwinoutmode", dwinoutmode));
                da.SelectCommand.Parameters.Add(new SqlParameter("dwdate", date));
                da.SelectCommand.Parameters.Add(new SqlParameter("dwtime", time));
                da.SelectCommand.Parameters.Add(new SqlParameter("dwworkcode", workcode));
                da.SelectCommand.CommandTimeout = 0;
                conpro.Open();
                da.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);
                da.SelectCommand.ExecuteNonQuery();
                conpro.Close();
                //con.Dispose();
            }
            catch (SqlException e)
            {
                ret++;
            }
            finally
            {
               
            }
            return ret;                    }       

解决方案 »

  1.   

    已经很多年不用ado.net ...................
      

  2.   

    ADO.NET一个connection只允许有一个DataReader,如果想用多个的话,必须关闭先前的DataReader然后再打开新的DataReader,这句话似乎是多余的,因为执行后没有使用返回的DataReader,应该将其去掉?
    da.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);
      

  3.   

    using(da.SelectCommand = new SqlCommand());
    这句话也没用,很奇怪为何不出错,            try
                {
                    string connectionString = Properties.Settings.Default.standConnectionString.ToString();
                    using(SqlConnection conpro = new SqlConnection(connectionString)
    {            
                    //con.ConnectionTimeout = 0;
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = new SqlCommand();
                    da.SelectCommand.Connection = conpro;
                    da.SelectCommand.CommandText = spstr;
                    da.SelectCommand.CommandType = CommandType.StoredProcedure;
                    da.SelectCommand.Parameters.Add(new SqlParameter("@macno", macno));
                    da.SelectCommand.Parameters.Add(new SqlParameter("@mactype", mactype));
                    da.SelectCommand.Parameters.Add(new SqlParameter("@dwenrollnumber", empno));
                    da.SelectCommand.Parameters.Add(new SqlParameter("dwverifymode", verifymode));
                    da.SelectCommand.Parameters.Add(new SqlParameter("dwinoutmode", dwinoutmode));
                    da.SelectCommand.Parameters.Add(new SqlParameter("dwdate", date));
                    da.SelectCommand.Parameters.Add(new SqlParameter("dwtime", time));
                    da.SelectCommand.Parameters.Add(new SqlParameter("dwworkcode", workcode));
                    da.SelectCommand.CommandTimeout = 0;
                    conpro.Open();
                    r=da.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);
                    if (r!=null)
                    {
                          r.Close();
                    }
                    da.SelectCommand.ExecuteNonQuery();
                    conpro.Close();
                    //con.Dispose();
    }
                }
                catch(...
      

  4.   

    谢谢楼上的两位回答,这个是是放在一个循环内的,要执行很多次的。
    按2楼的去掉
    da.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);
    后 ,
    又提示这个:
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
      

  5.   

    你创建的链接太多了,如果循环执行命令,可以只用一个链接,把循环放在using(SqlConnection conpro = new SqlConnection(connectionString)
    内,
      

  6.   

    不过可能你只要把SqlConnection conpro = new SqlConnection(connectionString)放到using内就可以解决问题:using(SqlConnection conpro = new SqlConnection(connectionString))
    {
        ....
    }
      

  7.   

    按道理说你实例化一个连接对象,使用后,然后再释放这个对象,那么下一次循环的时候应该是可以去再次实例化一个新对象的如果说是Enterprise Library这样企业库的话,对象是不会真的释放,而是在实例池中候着,等待下一次的实例在使用吧难道是说系统内存在释放这个对象的时候赶不上系统创建对象的速度,才出现这种实例池对象已满的原因??求高手指教
      

  8.   

    SqlConnection conpro = new SqlConnection(connectionString)会在连接池里创建新连接,不过楼主的程序已经调用conpro.Close();显式关闭了连接,这就很奇怪,应该不会引起连接池溢出问题,我是怀疑using(da.SelectCommand = new SqlCommand());这句话造成某种程度的破坏,应该去掉using,
      

  9.   

    另外,他的conpro.Close();没有放在finally内,这样不符合规范,在发生异常时可能不能正确释放,
      

  10.   

    谢谢各位,stonespace的耐心解答,C#是赶鸭子上架,一团懵啊。
    加上这个
    using(SqlConnection conpro = new SqlConnection(connectionString))
    {
      ....
    }
    后问题就OK了。