2016-12-28 5 views
3
class CommonConnection 
{ 
    public class dStructure 
    { 
     public static string ConnectionString = ""; 
    } 

    public SqlConnection Conn; 
    #region "Connection Procedures" 
    public string ConnectionString 
    { 
     get 
     { 
      string sConn = string.Empty; 
      sConn = @"Server=ServerName;Initial Catalog=Database;User ID=userid;Password=password;"; 
      dStructure.ConnectionString = sConn; 
      return dStructure.ConnectionString; 

     } 
    } 

    public void cnOpen() 
    { 
     try 
     { 
      if (Conn == null) 
      { 
       Conn = new System.Data.SqlClient.SqlConnection(); 
      } 
      if (Conn.State == ConnectionState.Open) 
      { 
       Conn.Close(); 
      } 
      Conn.ConnectionString = ConnectionString; 
      Conn.Open(); 
     } 
     catch (SqlException e) 
     { 
      SqlConnection.ClearAllPools(); 
      throw e; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    public void cnClose() 
    { 
     try 
     { 
      if ((Conn != null)) 
      { 
       if (Conn.State == ConnectionState.Open) 
       { 
        Conn.Close(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      Conn = null; 
     } 
    } 
    #endregion 

    public int ExecuteQuery(string strQuery, Int16 TimeOut = 30) 
    { 
     int RecordsAffected; 
     SqlCommand cmd; 
     try 
     { 
      cnOpen(); 
      cmd = new SqlCommand(strQuery, Conn); 
      cmd.CommandTimeout = TimeOut; 
      RecordsAffected = cmd.ExecuteNonQuery(); 

      return RecordsAffected; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      cnClose(); 
      cmd = null; 
     } 
    }   
} 

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

public int ExecuteQuery(string strQuery, short TimeOut = 10) 
    { 
     SqlConnection NewConn = new SqlConnection(); 
     try 
     { 
      if (NewConn == null) 
      { 
       NewConn = new System.Data.SqlClient.SqlConnection(); 
      } 
      if (NewConn.State == ConnectionState.Open) 
      { 
       NewConn.Close(); 
      } 
      NewConn.ConnectionString = "Server=ServerName;Initial Catalog=Database;User ID=userid;Password=password;"; 
      NewConn.Open(); 

      return new SqlCommand(strQuery, NewConn) 
      { 
       CommandTimeout = ((int)TimeOut) 
      }.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      NewConn.Close(); 
     } 
    } 

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

// Обновление 2 Как и в другом вопросе, я пробовал использовать код ниже, но проблема остается такой же.

public int ExecuteQuery(string strQuery, short TimeOut = 10) 
    { 
     int executeReader = 0; 
     try 
     { 
      using (SqlConnection connection = new SqlConnection(@"Server=Server;Initial Catalog=DB;User ID=id;Password=Password;")) 
      { 
       try 
       { 
        connection.Open(); 
        SqlCommand command = new SqlCommand(strQuery, connection); 
        command.CommandType = CommandType.Text; 
        command.CommandTimeout = TimeOut; 
        executeReader = command.ExecuteNonQuery(); 
       } 
       catch (Exception ex) 
       { 
        throw ex; 
       } 
      } 
      return executeReader; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

Как предлагалось, используя команду, используемую по умолчанию IDisposable, поэтому не нужно закрывать соединение.

+0

Вы пробовали просто «новый SqlConnection (« ... connection string ... »);'? –

+0

Также указывается точное место, где вы получаете исключение, так как изменение свойства строки соединения объекта SqlConnection разрешено. –

+1

И код излишне свернутый. Сначала вы создаете новый объект SqlConnection, затем вводите try/catch, где вы проверяете, является ли переменная нулевой, той, на которую вы просто ввели ссылку на объект, поэтому этого не может быть. Затем вы проверяете, открыто ли соединение, но поскольку он был только что сконструирован, он будет закрыт. Затем вы устанавливаете строку подключения и открываете ее. Можете ли вы упростить код и определить точное место, где вы получаете свое исключение? –

ответ

1

попробовать этот

Класс:

public class CommonConnection 
{ 
    String constr = System.Configuration.ConfigurationManager.ConnectionStrings["myconectionstring"].ConnectionString; 
    public CommonConnection() 
    { 

     // 
     // TODO: Add constructor logic here 
     // 
    } 
    //Insert,Update,Delete.... 
    public int ExecuteNonQuery1(string str) 
    { 
     //String constr = System.Configuration.ConfigurationManager.ConnectionStrings["CommonConnection"].ConnectionString; 

     SqlConnection con = new SqlConnection(constr); 

     SqlCommand cmd = new SqlCommand(str, con); 


     int result = 0; 

     try 
     { 

      con.Open(); 
      result = cmd.ExecuteNonQuery(); 


      con.Close(); 
     } 
     catch (Exception ex) 
     { 
      result = -1; 
      try 
      { 
       if (con.State == ConnectionState.Open) 
       { 
        con.Close(); 
       } 
      } 
      catch (Exception ex2) 
      { 
       // ErrHandler.WriteError(ex2.ToString()); 
      } 
      // ErrHandler.WriteError(ex.ToString()); 
     } 

     return result; 

    } 
} 

ASPX.CS:

 SortedList s1 = new SortedList(); 
     s1.Add("@mode", "Update"); 
     s1.Add("@cid", ViewState["CategoryId"]); 
     int a = sp.ExecuteNonQuerySP1("SP_Name", s1); 
     if (a > 0) 
     { 
     } 
+0

Может не работать, поскольку никаких серьезных изменений в коде не сравнится с моим. Хотя будет обновлять u после проверки –

+0

Жаль, что это не работает. –

1

В обоих вашего кода DEMO здесь улов .. позволяет проверить это.

public void cnOpen() 
     { 
      try 
      { 
       if (Conn == null) 
       { 
        Conn = new System.Data.SqlClient.SqlConnection(); 
       } 
       if (Conn.State == ConnectionState.Open) 
       { 
        Conn.Close(); 
       } 
       Conn.ConnectionString = ConnectionString; 
       Conn.Open(); 
      }` 

if conn == null Пусть тогда он будет идти внутри блока и создать новое соединение и все в порядке. но что, если условие будет ложно, то оно не будет создавать новый экземпляр sqlConnection и он будет двигаться к второму, если условие

if (Conn.State == ConnectionState.Open) 
      { 
       Conn.Close(); 
      } 

Так как вы сказали, когда более запрос выполняется, поэтому он также может случиться, что состояние соединения будут ничего, кроме открытого, как соединение, выборка, нарушение и т. д., поэтому это условие будет ложным, если какое-либо из них произойдет, кроме ConnectionState.Open, и ваше существующее соединение не будет закрыто, и дальше оно перейдет к следующей строке, где он встретится

Conn.ConnectionString = ConnectionString; 

Если ваш контакт ction не закрывается, тогда он попытается изменить строку подключения существующего соединения (SqlConnection). Который не может быть изменен, если экземпляр не удаляется. Поэтому он будет генерировать исключение.

EDIT Попробуйте сделать что-нибудь подобное и удалите Conn.open() с этого блока кода.

if (Conn.State == ConnectionState.Open) 
      { 
       Conn.Close(); 
      } 
    if (Conn == null) 
       { 
        Conn = new System.Data.SqlClient.SqlConnection(); 
        Conn.ConnectionString = ConnectionString; 


       } 

и еще одна вещь, которую вам нужно обновить в общественном Int ExecuteQuery(string strQuery, Int16 TimeOut = 30) в методе. положите эту строку Conn.Open(); после cmd.CommandTimeout = TimeOut;

public int ExecuteQuery(string strQuery, Int16 TimeOut = 30) 
    { 
     int RecordsAffected; 
     SqlCommand cmd; 
     try 
     { 
      cnOpen(); 
      cmd = new SqlCommand(strQuery, Conn); 
      cmd.CommandTimeout = TimeOut; 
      Conn.Open(); //Add this here 
      RecordsAffected = cmd.ExecuteNonQuery(); 

      return RecordsAffected; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      cnClose(); 
      cmd = null; 
     } 
    }   
} 
+0

Напишите cnOpen(); во втором, если блок после NewConn.Close(); и проверьте, нормально ли это сейчас! – Rajput

+0

Теперь я получаю «Свойство ConnectionString не было инициализировано». ошибка. Итак, я изменил, как показано ниже, if (string.IsNullOrEmpty (NewConn.ConnectionString)) NewConn.ConnectionString = Строка подключения здесь »; После этого я получил ниже erros, 1) Не разрешено изменять свойство ConnectionString. 2) Свойство SelectCommand.Connection не было инициализировано 3) ExecuteReader требует открытого и доступного соединения. Текущее состояние подключения открыто. Пожалуйста, помогите мне –

+0

Обновлено мое сообщение, пожалуйста, проверьте его и позвольте я знаю. – Rajput

Смежные вопросы