2009-02-02 4 views
44

Lorsque je modifie la chaîne de connexion à l'aide de ce code, elle ne recharge pas app.config lors de l'exécution. Je m'attendais à le recharger de la même façon que nous recharger app.config.Modifier la chaîne de connexion et recharger app.config au moment de l'exécution

config.ConnectionStrings.ConnectionStrings["JVVNL_NEW.Properties.Settings.JVVNL_NEWConnectionString1"].ConnectionString = ConString; 
config.ConnectionStrings.ConnectionStrings["CMS_NEW.Properties.Settings.JVVNL_NEWConnectionString1"].ConnectionString = ConString; 
config.Save(ConfigurationSaveMode.Modified,true); 
ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.SectionName); 
+2

S'il vous plaît reformater correctement extrait de code. C'est très difficile à lire maintenant. – Cerebrus

Répondre

6

IIRC, le ConfigurationManager.RefreshSection nécessite un paramètre de chaîne spécifiant le nom de la section pour rafraîchir:

ConfigurationManager.RefreshSection("connectionStrings"); 

Je pense que l'application ASP.NET doit recharger automatiquement lorsque l'élément connectionStrings est modifié et la configuration n'a pas besoin d'être rechargée manuellement.

1

Oui, quand ASP.NET web.config est mis à jour, l'application entière est redémarrée, ce qui signifie que le fichier web.config est rechargé.

2

Vous pouvez également actualiser la configuration dans son intégralité:

ConnectionStringSettings importToConnectionString = currentConfiguration.ConnectionStrings.ConnectionStrings[newName]; 

if (importToConnectionString == null) 
{ 
    importToConnectionString = new ConnectionStringSettings(); 
    importToConnectionString.ConnectionString = importFromConnectionString.ConnectionString; 
    importToConnectionString.ProviderName = importFromConnectionString.ProviderName; 
    importToConnectionString.Name = newName; 
    currentConfiguration.ConnectionStrings.ConnectionStrings.Add(importToConnectionString); 
} 
else 
{ 
    importToConnectionString.ConnectionString = importFromConnectionString.ConnectionString; 
    importToConnectionString.ProviderName = importFromConnectionString.ProviderName; 
} 

Properties.Settings.Default.Reload(); 
+0

Bonjour Neil, pourriez-vous développer votre réponse? Je suis un noob. Comment définir currentConfiguration et importFromConnectionString? – robnardo

+0

@ neil-barnwell: S'il vous plaît elborate l'implémentation de la ligne "Properties.Settings.Default.Reload();". En ce moment, il est trop énigmatique à comprendre – dotnetguy

+0

@mishrsud Eh bien, il fait ce qu'il dit - il charge en mémoire les paramètres que vous venez d'enregistrer dans le fichier. –

74

avait à faire cette chose exacte. Ceci est le code qui a fonctionné pour moi:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings"); 
connectionStringsSection.ConnectionStrings["Blah"].ConnectionString = "Data Source=blah;Initial Catalog=blah;UID=blah;password=blah"; 
config.Save(); 
ConfigurationManager.RefreshSection("connectionStrings"); 
+0

@Bradley: J'essaie de faire la même chose mais je reçois des problèmes de droits UAC ... parce que app.config est dans les fichiers de programme. Est-il possible de changer l'emplacement de app.config? J'ai essayé 'AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData) + "\\ app.config"); 'dans' Main() 'mais cela a fonctionné. – prasy

+1

@Bradley Ceci jette une exception NullReferenceException pour moi donc je l'ai changé en 'config.ConnectionStrings.ConnectionStrings.Add (new ConnectionStringSettings())' mais le reste du code fonctionne. Merci! – knguyen

+0

@knguyen Des sons comme vous n'avaient pas de section de configuration nommée "connectionStrings" ou n'avaient pas de chaîne de connexion définie dans cette section avec le nom que vous avez spécifié dans la ligne 3 (que j'ai nommé "Blah") de l'exemple. –

1

D'abord, vous voudrez peut-être ajouter

using System.Configuration; 

à votre fichier .cs. S'il n'est pas disponible, ajoutez-le via les références du projet car il n'est pas inclus par défaut dans un nouveau projet.

Ceci est ma solution à ce problème. J'ai d'abord créé la classe ConnectionProperties qui enregistre les éléments dont j'ai besoin de changer dans la chaîne de connexion d'origine. La variable _name dans la classe ConnectionProperties est importante pour être le nom de connectionString La première méthode prend une chaîne de connexion et modifie l'option souhaitée avec la nouvelle valeur.

private String changeConnStringItem(string connString,string option, string value) 
    { 
     String[] conItems = connString.Split(';'); 
     String result = ""; 
     foreach (String item in conItems) 
     { 
      if (item.StartsWith(option)) 
      { 
       result += option + "=" + value + ";"; 
      } 
      else 
      { 
       result += item + ";"; 
      } 
     } 
     return result; 
    } 

Vous pouvez modifier cette méthode pour répondre à vos besoins. J'ai les deux connexions mysql et mssql donc j'avais besoin des deux. Bien sûr, vous pouvez affiner ce projet de code pour vous-même.

private void changeConnectionSettings(ConnectionProperties cp) 
{ 
    var cnSection = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
    String connString = cnSection.ConnectionStrings.ConnectionStrings[cp.Name].ConnectionString; 
    connString = changeConnStringItem(connString, "provider connection string=\"data source", cp.DataSource); 
    connString = changeConnStringItem(connString, "provider connection string=\"server", cp.DataSource); 
    connString = changeConnStringItem(connString, "user id", cp.Username); 
    connString = changeConnStringItem(connString, "password", cp.Password); 
    connString = changeConnStringItem(connString, "initial catalog", cp.InitCatalogue); 
    connString = changeConnStringItem(connString, "database", cp.InitCatalogue); 
      cnSection.ConnectionStrings.ConnectionStrings[cp.Name].ConnectionString = connString; 
    cnSection.Save(); 
    ConfigurationManager.RefreshSection("connectionStrings"); 
} 

Comme je ne voulais pas ajouter d'informations triviales, j'ai ignoré la zone Propriétés de mon code. Veuillez l'ajouter si vous voulez que cela fonctionne.

class ConnectionProperties 
{ 
    private String _name; 
    private String _dataSource; 
    private String _username; 
    private String _password; 
    private String _initCatalogue; 

    /// <summary> 
    /// Basic Connection Properties constructor 
    /// </summary> 
    public ConnectionProperties() 
    { 

    } 

    /// <summary> 
    /// Constructor with the needed settings 
    /// </summary> 
    /// <param name="name">The name identifier of the connection</param> 
    /// <param name="dataSource">The url where we connect</param> 
    /// <param name="username">Username for connection</param> 
    /// <param name="password">Password for connection</param> 
    /// <param name="initCat">Initial catalogue</param> 
    public ConnectionProperties(String name,String dataSource, String username, String password, String initCat) 
    { 
     _name = name; 
     _dataSource = dataSource; 
     _username = username; 
     _password = password; 
     _initCatalogue = initCat; 
    } 
// Enter corresponding Properties here for access to private variables 
} 
0

// Voici comment faire dans Windows App.Config

public static bool ChangeConnectionString(string Name, string value, string providerName, string AppName) 
    { 
     bool retVal = false; 
     try 
     { 

      string FILE_NAME = string.Concat(Application.StartupPath, "\\", AppName.Trim(), ".exe.Config"); //the application configuration file name 
      XmlTextReader reader = new XmlTextReader(FILE_NAME); 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(reader); 
      reader.Close(); 
      string nodeRoute = string.Concat("connectionStrings/add"); 

      XmlNode cnnStr = null; 
      XmlElement root = doc.DocumentElement; 
      XmlNodeList Settings = root.SelectNodes(nodeRoute); 

      for (int i = 0; i < Settings.Count; i++) 
      { 
       cnnStr = Settings[i]; 
       if (cnnStr.Attributes["name"].Value.Equals(Name)) 
        break; 
       cnnStr = null; 
      } 

      cnnStr.Attributes["connectionString"].Value = value; 
      cnnStr.Attributes["providerName"].Value = providerName; 
      doc.Save(FILE_NAME); 
      retVal = true; 
     } 
     catch (Exception ex) 
     { 
      retVal = false; 
      //Handle the Exception as you like 
     } 
     return retVal; 
    } 
3
//You can apply the logic in "Program.cs" 

//Logic for getting new connection string 
//**** 
// 

MyDBName="mydb"; 

// 
//**** 

//Assign new connection string to a variable 
string newCnnStr = a="Data Source=.\SQLExpress;Initial Catalog=" + MyDBName + ";Persist Security Info=True;User ID=sa;Password=mypwd"; 

//And Finally replace the value of setting 
Properties.Settings.Default["Nameof_ConnectionString_inSettingFile"] = newCnnStr; 

//This method replaces the value at run time and also don't needs app.config for the same setting. It will have the va;ue till the application runs. 

//It worked for me. 
+0

merci beaucoup mon pote –

+0

Classe de propriétés – abreneliere

Questions connexes