Ошибка: ExecuteReader требует открытого и доступного соединения. Состояние текущего соединения открыто

У меня есть сайт mvc 4 с DataHelperClass ниже для выполнения запроса. Моя проблема иногда, веб-сайт через выступление в качестве названия. Я использовал блок для размещения SqlCommand и SqlDataAdapter, но не успел.

Пожалуйста, помогите мне, извините за мой английский.

        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(); }
        }

Ответы

Ответ 1

Это может быть вызвано тем, что ваше соединение не открывается, потому что когда этот код вызывается:

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

Состояние соединения может быть: Broken, или Connecting или Fetching (см. Список перечислений).

Это может произойти, если вы попытаетесь поделиться своим соединением между многими потоками. Я думаю, вам нужно создавать новое соединение каждый раз при вызове этого метода. Вы можете найти множество примеров, как это сделать, включая MSDN.

EDIT:

Для такого вопроса есть отличный ответ: ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения - "Подключение".

Но если вы действительно нуждаетесь в этом, попробуйте предотвратить использование одного и того же соединения с двумя или более потоками с помощью lock (на самом деле это неправильно, см. Ссылку выше):

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