Ошибка на сервере «executenonquery требует открытого и доступного соединения»

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

Ошибка:

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

Код:

int n;

try
{
    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection = DataConnection.Con;
        cmd.CommandText = "sp_InsertUpdateDeleteValidationDate";
        cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 0;
        cmd.Parameters.AddWithValue("@Task", "CheckExist");
        cmd.Parameters.AddWithValue("@id", 0);
        cmd.Parameters.AddWithValue("@AdId", "");
        cmd.Parameters.AddWithValue("@Username", "");
        cmd.Parameters.AddWithValue("@DOE", DOE);
        cmd.Parameters.AddWithValue("@ExpieryDate", DateTime.Now);
        cmd.Parameters.AddWithValue("@DOR", DateTime.Now);
        cmd.Parameters.Add("@flag", SqlDbType.Int).Direction = ParameterDirection.Output;

        if (cmd.Connection.State  == ConnectionState.Closed)
        {
            cmd.Connection.Open();
        }
        cmd.ExecuteNonQuery();
        n = Convert.ToInt32(cmd.Parameters["@flag"].Value);
        return n;
    }
}
catch (SqlException Ex)
{

    return 0;
}

person Boktiar    schedule 10.11.2014    source источник
comment
что такое подключение к данным?   -  person lockstock    schedule 10.11.2014
comment
это может помочь stackoverflow.com/questions/9705637/   -  person lockstock    schedule 10.11.2014
comment
открытый класс DataConnection { частный статический SqlConnection SqlCon = новый SqlConnection (ConfigurationManager.ConnectionStrings[conn].ConnectionString); public static SqlConnection Con { get { return SqlCon; } } }   -  person Boktiar    schedule 10.11.2014
comment
пожалуйста, добавьте это к своему вопросу, чтобы его можно было прочитать   -  person lockstock    schedule 10.11.2014


Ответы (2)


Вы создаете только одно соединение в своем классе DataConnection. Вы должны создать новое соединение для каждого вызова базы данных и позволить пулу соединений драйвера позаботиться об их эффективном повторном использовании.

измените свой класс DataConnection на это:

public class DataConnection
{
    public static SqlConnection Con
    {
        get 
        { 
            return new SqlConnection(ConfigurationManager
                .ConnectionStrings["conn"].ConnectionString); 
        }
    }
}

и используйте оператор using, когда вы используете соединение, как в ответе ekad:

using (SqlConnection conn = DataConnection.Con)
{
    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection = conn;
        //use the command here
    }
}
person lockstock    schedule 10.11.2014
comment
Не могли бы вы объяснить это немного подробнее? У меня похожая ситуация, однако об исключении сообщалось только один раз. Я даже создал тестовое приложение, которое удаляет и повторно вставляет одну и ту же запись 1000 раз, не закрывая соединение, и не сталкивался с ошибкой. Это будет происходить только изредка, т.е. если несколько вызовов базы данных выполняются с использованием одного открытого соединения, и если да, то почему? - person colmde; 04.09.2017

Похоже, ваш SqlConnection никогда не закрывался. Попробуйте использовать оператор using, чтобы убедиться, что SqlConnection закрывается после выполнения cmd.ExecuteNonQuery()

int n;

try
{
    using (SqlConnection conn = DataConnection.Con)
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandText = "sp_InsertUpdateDeleteValidationDate";
            cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 0;
            cmd.Parameters.AddWithValue("@Task", "CheckExist");
            cmd.Parameters.AddWithValue("@id", 0);
            cmd.Parameters.AddWithValue("@AdId", "");
            cmd.Parameters.AddWithValue("@Username", "");
            cmd.Parameters.AddWithValue("@DOE", DOE);
            cmd.Parameters.AddWithValue("@ExpieryDate", DateTime.Now);
            cmd.Parameters.AddWithValue("@DOR", DateTime.Now);
            cmd.Parameters.Add("@flag", SqlDbType.Int).Direction = ParameterDirection.Output;

            conn.Open();        
            cmd.ExecuteNonQuery();
            n = Convert.ToInt32(cmd.Parameters["@flag"].Value);
            return n;
        }
    }
}
catch (SqlException Ex)
{

    return 0;
}
person ekad    schedule 10.11.2014