asp.net jquery add row (строка-клон) с текстовым полем и динамически раскрывающийся список

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 - ";
    }
14
задан Rob 23 August 2010 в 13:45
поделиться

4 ответа

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

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

18
ответ дан 1 December 2019 в 09:00
поделиться

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

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

1
ответ дан 1 December 2019 в 09:00
поделиться

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

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

Удалите поведение команды, все будет в порядке, или повторно откройте соединение в следующем операторе if.

Это

SqlDataReader rdr = cmd.ExecuteReader();

Или это

if (rowsReturned == true){
   cn.open();
4
ответ дан 1 December 2019 в 09:00
поделиться

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

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

5
ответ дан 1 December 2019 в 09:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: