Подтвердить что ты не робот

Для ExecuteNonQuery требуется открытое и доступное соединение. Состояние тока соединения закрыто

ExecuteNonQuery требует открытого и доступного соединения. Состояние тока соединения закрыто.

Что я здесь делаю неправильно? Я предполагаю, что вы можете повторно использовать соединение?

Спасибо за любую помощь!

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()))
{
    cn.Open();

    // If we are reverting to an old type
    if (pageAction == "revert")
    {
        debug.Text = "FLAG 1";

        // Get the revert ID
        int revertingID = int.Parse(Request.QueryString["revID"]);
        bool rowsReturned = false;

        debug.Text = "FLAG 2 - " + revertingID.ToString();

        // Set all to 0
        using (SqlCommand cmd = new SqlCommand("SELECT ID FROM tblSiteSettings WHERE ID = " + revertingID, cn))
        {
            // If it exists
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            if (rdr.Read())
            {
                rowsReturned = true;
            }
            rdr.Close();
        }

        debug.Text = "FLAG 3 - " + rowsReturned.ToString();

        // Set new active and reset others
        if (rowsReturned == true)
        {
            using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 1 WHERE ID = " + revertingID, cn))
            {
                cmd.ExecuteNonQuery();
            }
            using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 0 WHERE ID <> " + revertingID, cn))
            {
                cmd.ExecuteNonQuery();
            }
        }
        //debug.Text = "FLAG 4 - ";
    }
4b9b3361

Ответ 1

Ваша проблема:

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

Вам нужно просто позвонить cmd.ExecuteReader()', если вы хотите использовать соединение еще до того, как "избавиться" от него. Если вы хотите понять, что делает CommandBehaviour.CloseConnection часть/означает, то хорошая документация для SqlCommand.ExecuteReader. Там также документация, чтобы рассказать вам, какие все возможные значения перечисление CommandBehaviour. По существу CommandBehaviour.CloseConnection выполняет следующие действия:

Когда команда выполняется, связанный объект Connection закрывается, когда связанный объект DataReader закрыт.

Если у вас нет особой необходимости указывать CommandBehaviour, укажите либо CommandBehaviour.Default, либо не укажете его вообще. CommandBehaviour.Default:

Запрос может возвращать несколько наборов результатов. Выполнение запроса может повлиять на состояние базы данных. По умолчанию не заданы флаги CommandBehavior, поэтому вызов ExecuteReader (CommandBehavior.Default) функционально эквивалентен вызову ExecuteReader().

Ответ 2

Вы закрываете соединение rdr.Close(); и никогда не открываете его перед вызовом ExecuteNonQuery().

Вам вообще не нужно закрывать его, если он завернут в using, поскольку вызов Dispose() автоматически закроет соединение для вас.

Ответ 3

Кажется, что вы читаете перед выполнением ExecuteNonQuery. При первом вызове SqlCommand (для SELECT) вы закрываете соединение после завершения чтения.

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

Извлеките поведение команды, вам должно быть хорошо идти или повторно открыть соединение в следующем операторе if.

Это

SqlDataReader rdr = cmd.ExecuteReader();

Или это

if (rowsReturned == true){
   cn.open();

Ответ 4

Прямо здесь ваш SqlDataReader закроет соединение, когда оно будет завершено:

// Set all to 0 
using (SqlCommand cmd = new SqlCommand("SELECT ID FROM tblSiteSettings WHERE ID = " + revertingID, cn)) 
{ 
    // If it exists 
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    if (rdr.Read()) 
    { 
        rowsReturned = true; 
    } 
    rdr.Close(); 
} 

Позднее раздел "Установить новый активный и reset другие" завершится неудачно, поскольку соединение закрыто.

Ответ 5

Просто добавьте cn.Open раньше или не закрывайте его.