2013-12-19 72 views
9

私は以下のDataHelperClassを持つmvc 4ウェブサイトでクエリを実行しています。私の問題は時々、ウェブサイトからタイトルとしてのウェブサイトです。私は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、またはConnectingまたはFetching(すべてenum listを参照してください)。

これは、多くのスレッド間で接続を共有しようとすると発生する可能性があります。このメソッドが呼び出されるたびに新しい接続を作成する必要があると思います。 MSDNを含む多くの例でそれを行う方法を見つけることができます。

EDIT

、このような質問のための偉大な答えがあります:ExecuteReader requires an open and available Connection. The connection's current state is Connecting

は、しかし、あなたが本当に、本当にそれが必要な場合は、使用して、2つの以上のスレッドで同じ接続を使用して防ごう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

関連する問題