Alors que plus de requêtes s'exécutent, j'ai "Non autorisé à changer la propriété 'ConnectionSsortingng'."

class CommonConnection { public class dStructure { public static ssortingng ConnectionSsortingng = ""; } public SqlConnection Conn; #region "Connection Procedures" public ssortingng ConnectionSsortingng { get { ssortingng sConn = ssortingng.Empty; sConn = @"Server=ServerName;Initial Catalog=Database;User ID=userid;Password=password;"; dStructure.ConnectionSsortingng = sConn; return dStructure.ConnectionSsortingng; } } public void cnOpen() { try { if (Conn == null) { Conn = new System.Data.SqlClient.SqlConnection(); } if (Conn.State == ConnectionState.Open) { Conn.Close(); } Conn.ConnectionSsortingng = ConnectionSsortingng; 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(ssortingng 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; } } } 

// J'ai essayé une autre option comme ci-dessous,

  public int ExecuteQuery(ssortingng 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.ConnectionSsortingng = "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(); } } 

Mais toujours le même problème. Son application de bureau, multi-thread. Mais tandis que plus de requête charge sur ceci, je reçois Non autorisé à modifier la propriété 'ConnectionSsortingng'. L'état actuel de la connection est ouvert. Notez que pas chaque fois que je reçois ce problème, seulement quand plus de requêtes sont en cours d'exécution.

// Mise à jour 2 Comme suggéré dans une autre question, j'ai essayé avec le code ci-dessous mais le problème rest le même.

  public int ExecuteQuery(ssortingng 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; } } 

Comme suggéré ici, en utilisant la command utilisée par défaut IDisposable, donc pas besoin de fermer la connection.

essaye ça

Classe:

  public class CommonConnection { Ssortingng constr = System.Configuration.ConfigurationManager.ConnectionSsortingngs["myconectionssortingng"].ConnectionSsortingng; public CommonConnection() { // // TODO: Add constructor logic here // } //Insert,Update,Delete.... public int ExecuteNonQuery1(ssortingng str) { //Ssortingng constr = System.Configuration.ConfigurationManager.ConnectionSsortingngs["CommonConnection"].ConnectionSsortingng; 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.ToSsortingng()); } // ErrHandler.WriteError(ex.ToSsortingng()); } 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) { } 

Dans les deux de votre code DEMO voici capture .. permet de vérifier cela.

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

Supposons que if conn == null alors il ira à l'intérieur du bloc et créera une nouvelle connection et tout ira bien. mais que se passe-t-il si la condition est fausse, alors il ne créera pas une nouvelle instance de sqlConnection et passera à la seconde si la condition

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

Puisque vous avez dit quand plus de requête est en cours d'exécution , il peut aussi arriver que l'état de connection soit autre chose que ouvrir, connecter, extraire, rompre, etc si cette condition est fausse si l'une d'entre elles se produit sauf ConnectionState.Open et votre existant la connection ne sera pas fermée et plus loin, il ira à la ligne suivante où il rencontrera

 Conn.ConnectionSsortingng = ConnectionSsortingng; 

Si votre connection n'est pas fermée, elle tentera de modifier la string de connection de la connection existante (instance SqlConnection). Ce qui ne peut pas être changé si instance n'est pas disposé. Donc, il va jeter une exception.

EDIT Essayez de faire quelque chose comme ça et supprimez Conn.open() de ce bloc de code.

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

et encore une chose que vous devez mettre à jour dans public int ExecuteQuery(ssortingng strQuery, Int16 TimeOut = 30) dans la méthode. mettez cette ligne Conn.Open(); après cmd.CommandTimeout = TimeOut ;

 public int ExecuteQuery(ssortingng 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; } } }