Для ExecuteNonQuery требуется открытое и доступное соединение. Текущее состояние соединения закрыто - PullRequest
14 голосов
/ 23 августа 2010

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

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

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

Ответы [ 5 ]

17 голосов
/ 23 августа 2010

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

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 ().

5 голосов
/ 23 августа 2010

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

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

4 голосов
/ 23 августа 2010

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

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

Удалите командное поведение, вам следует начать или заново открыть соединение в следующем операторе if.

Это

SqlDataReader rdr = cmd.ExecuteReader();

Илиэто

if (rowsReturned == true){
   cn.open();
2 голосов
/ 15 февраля 2016

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

1 голос
/ 23 августа 2010

Прямо здесь, ваш 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(); 
} 

Позже раздел «Установить новый активный и сбросить другие» завершится ошибкой, потому что соединение закрыто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...