2014-11-10 5 views
0

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

Ошибка: не

executenonquery requires an open and available connection. The connection's current state is open.

Код:

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; 
} 
+0

что DataConnection? – lockstock

+0

это может помочь http://stackoverflow.com/questions/9705637/executereader-requires-an-open-and-available-connection-the-connections-curren – lockstock

+0

общественного класс DataConnection { частного статического SqlConnection SqlCon = нового SqlConnection (ConfigurationManager.ConnectionStrings [ "подключ"] ConnectionString). public static SqlConnection Con { Получать { { возвращение SqlCon; } } } – Boktiar

ответ

3

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

изменить класс DataConnection к этому:

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

и использовать с помощью заявление, когда вы используете подключение, как в ответ ekad в:

using (SqlConnection conn = DataConnection.Con) 
{ 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.Connection = conn; 
     //use the command here 
    } 
} 
+0

Не могли бы вы объяснить это чуть дальше? У меня аналогичная ситуация, однако исключение было сообщено только один раз. Я даже создал тестовое приложение, которое удаляет и восстанавливает одну и ту же запись 1000 раз, не закрывая соединение и не сталкиваясь с ошибкой. Является ли это тем, что это будет происходить только иногда - то есть, если несколько вызовов базы данных выполняются с использованием единого открытого соединения, и если да, то почему? – colmde

0

Похоже, ваш SqlConnection не закрывается. Попробуйте использовать using statement, чтобы убедиться, что 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; 
}