2009-02-02 14 views
44

Quando cambio la stringa di connessione utilizzando questo codice, non ricarica app.config in fase di esecuzione. Mi aspettavo di ricaricare in modo simile a come ricarichiamo app.config.Modifica stringa di connessione e ricarica app.config in fase di esecuzione

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

consigliabile formattare correttamente lo snippet di codice. È molto difficile da leggere adesso. – Cerebrus

risposta

6

IIRC, il ConfigurationManager.RefreshSection richiede un parametro stringa che specifica il nome della sezione per aggiornare:

ConfigurationManager.RefreshSection("connectionStrings"); 

Penso che l'applicazione ASP.NET deve ricaricare automaticamente quando l'elemento viene modificato ConnectionStrings e la configurazione non ha bisogno di essere ricaricata manualmente.

1

Sì, quando viene aggiornato ASP.NET web.config, l'intera applicazione viene riavviata, il che significa che web.config viene ricaricato.

2

È inoltre possibile aggiornare la configurazione nella sua interezza:

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

Ciao Neil, potresti ampliare la tua risposta? Sono un noob. Come imposto currentConfiguration e importFromConnectionString? – robnardo

+0

@ neil-barnwell: elogiare l'implementazione della riga "Properties.Settings.Default.Reload();". Al momento è troppo criptico per capire – dotnetguy

+0

@mishrsud Beh, fa quello che dice: carica in memoria le impostazioni che hai appena salvato nel file. –

74

doveva fare questa cosa esatta. Questo è il codice che ha funzionato per me:

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: Sto provando a fare la stessa cosa ma sto ottenendo problemi con i diritti UAC ... perché app.config è nei programmi. C'è un modo posso cambiare la posizione di app.config. Ho provato 'AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData) + "\\ app.config"); 'in' Main() 'ma ha funzionato. – prasy

+1

@Bradley Questo genera una NullReferenceException per me quindi l'ho modificata in 'config.ConnectionStrings.ConnectionStrings.Add (new ConnectionStringSettings())', ma il resto del codice funziona. Grazie! – knguyen

+0

@knguyen Sembra che tu non abbiate una sezione di configurazione chiamata "connectionStrings" o che non abbia una stringa di connessione definita in quella sezione con il nome specificato nella riga 3 (che ho chiamato "Blah") dell'esempio. –

1

In primo luogo si potrebbe desiderare di aggiungere

using System.Configuration; 

al file .cs. Se non è disponibile, aggiungilo tramite i Riferimenti del progetto poiché non è incluso di default in un nuovo progetto.

Questa è la mia soluzione a questo problema. Prima ho creato la classe ConnectionProperties che salva gli elementi che devo modificare nella stringa di connessione originale. La variabile _name nella classe ConnectionProperties è importante per essere il nome della connectionString Il primo metodo accetta una stringa di connessione e modifica l'opzione desiderata con il nuovo valore.

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

È possibile modificare questo metodo per soddisfare le proprie esigenze. Ho entrambe le connessioni mysql e mssql quindi avevo bisogno di entrambi. Ovviamente puoi perfezionare questo codice di bozza per te stesso.

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"); 
} 

Come non volevo aggiungere informazioni banali ho omesso la regione Proprietà del mio codice. Per favore aggiungilo se vuoi che funzioni.

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

// qui è come farlo in 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

grazie a un amico del lotto –

+0

Che cos'è Classe di proprietà? – abreneliere

Problemi correlati