一个线程跑的时候没有任何问题 一开多线程就会报:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
   private static SqlConnection connection;        public static SqlConnection Connection
        {
            get
            {
                string connectionString = con;
                if (connection == null)
                {
                    connection = new SqlConnection(connectionString);
                    connection.Open();
                }
                else if (connection.State == System.Data.ConnectionState.Closed)
                {
                    connection.Open();
                }
                else if (connection.State == System.Data.ConnectionState.Broken)
                {
                    connection.Close();
                    connection.Open();
                }
                return connection;
            }
我知道是static SqlConnection connection 的问题。。但我不知道该怎么改了    新手 。。学习中。。请大虾指点下。。给出代码 。。谢谢

解决方案 »

  1.   

    connection是共享的,不能connection.Close
    另外,这种情况下只能每次new SqlConnection(),而不是共享,DataReader是不能共享connection的
      

  2.   

    ..原来是孟老师啊啊。。   我该怎么改不关闭connection能行么
      

  3.   

    两种方法:1.
    private static SqlConnection connection;
    这里不要存变量了,每次都new SqlConnection(connectionString);2.
    多线程加锁个人见解,未经实践,可能不对。
      

  4.   

    /// <summary>
    /// 互斥体
    /// </summary>
    private static System.Threading.Mutex mutex;
            public void 执行reader的方法()
    {    
               if (mutex == null)
                    mutex = new System.Threading.Mutex(false, "MutexLog");
                mutex.WaitOne();
                try
                {
                    //执行reader的代码
                }
                catch(System.Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    mutex.ReleaseMutex();
                }
    }
      

  5.   

    不关闭connection能行么你试试不就知道了?
      

  6.   

    简单的说:就是每个线程用新的链接(用连接字符串New一个Connection使用);
      

  7.   

    多线程最近写的比较多,异步 同步 共享 独享 等待
    打一个比方
       假如 有一个房子有很多人进出,如果只有把钥匙怎么办?
       解决办法自然就是门不锁,就好比你上面的 connection.close() 不关闭。或者给每一个人配一个把钥匙,有人进来自己开门,==>即每次都实例化一个ado.net 因为线程在某种意义上是独立的。或者并行进行的
      

  8.   

    建议楼主将你用的DataReader替换为DataTable或者Dataset,因为DataReader读取数据时,是不能关闭数据库连接的,假如,你另一个进程中取完数据以后,关闭了数据库连接,此时datareder就会直接报不能读的错误,这样的情况下,可能导致你的整个exe崩溃,我最近遇到这样的问题,Datareader明明是好的,但是主进程读取数据和其他线程读取数据关闭数据连接会发生冲突。
    所以建议楼主将DataReader更改为DataTable或者DataSet。
    另外就如9楼所言,不要关闭数据库连接。
      

  9.   

    SqlServer默认不开始多事务模式,一次只能有一个DataReader,而多事务模式并非很完美容易出错,我们一般也不用,所以建议你多线程就开多个connection,用完后close,因为有线程池的缘故并不会影响性能。
      

  10.   

    我认为这样多线程DataReader读取并不是很好,给数据库增加太大压力,建议使用Dataset