2013-12-19 111 views
9

我有mvc 4网站与DataHelperClass下面执行查询。我的问题是,有时候,网站通过作为标题的怀疑。我用block来处理SqlCommand和SqlDataAdapter,但没有成功。错误:ExecuteReader需要一个开放且可用的连接。该连接的当前状态是打开的

请帮助我,对不起我的英语。

 try 
     { 
      if (_conn.State == ConnectionState.Closed) 
       _conn.Open(); 

      using (SqlCommand sqlCommand = new SqlCommand(query, _conn)) 
      { 
       sqlCommand.CommandType = CommandType.StoredProcedure; 

       if (parameters != null) 
        sqlCommand.Parameters.AddRange(parameters); 

       //// check transaction is exist 
       if (_trans != null) 
        sqlCommand.Transaction = _trans; 

       DataTable dt = new DataTable(); 
       using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand)) 
       { 
        sqlDataAdapter.Fill(dt); 
       } 

       return dt; 
      } 
     } 
     finally 
     { 
      //// close connection automatically if transaction is not exist 
      if (_trans == null) { _conn.Close(); } 
     } 
+0

最有可能的'静态的SqlConnection _conn',你没有在样品中显示的问题。 –

回答

6

这可能会导致您的连接是不是真的开了,因为当该代码被称为:

if (_conn.State == ConnectionState.Closed) 
     _conn.Open(); 

连接状态可能是:Broken,或ConnectingFetching(查看所有enum list)。

如果您尝试在多个线程之间共享连接,可能会发生这种情况。我认为每次调用此方法时都需要创建一个新连接。你可以找到很多例子,包括MSDN

编辑

有这样一个问题,一个伟大的回答:ExecuteReader requires an open and available Connection. The connection's current state is Connecting

但如果你真的,真的需要它,请尝试使用,以防止使用同一个连接两个或多个线程lock(这是错误的实际,见上面的链接):

lock(_conn) 
{ 
    DataTable dt = new DataTable(); 
    using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand)) 
    { 
     sqlDataAdapter.Fill(dt); 
    } 
} 
+0

我已经取代if(_conn.State == ConnectionState.Closed)_conn.Open(); if(_trans == null){_conn = new SqlConnection(Utility.Connect); _conn.Open(); }但问题不能解决 –

+0

好吧,看我更新的答案。 – Tony

相关问题