it-swarm.com.de

Ändern Sie die Verbindungszeichenfolge und laden Sie app.config zur Laufzeit neu

Wenn ich die Verbindungszeichenfolge mit diesem Code ändere, wird app.config zur Laufzeit nicht neu geladen. Ich habe erwartet, dass es ähnlich wie beim Laden von app.config neu lädt.

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);
48
Ritu

Musste genau das tun. Dies ist der Code, der für mich funktioniert hat:

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

Für IIRC erfordert ConfigurationManager.RefreshSection einen Zeichenfolgenparameter, der den Namen des zu aktualisierenden Abschnitts angibt:

ConfigurationManager.RefreshSection("connectionStrings");

Ich denke, dass die ASP.NET-Anwendung automatisch neu geladen werden sollte, wenn das ConnectionStrings-Element geändert wird und die Konfiguration nicht manuell neu geladen werden muss.

6
Cerebrus
//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.
4
Romesh

Sie können die Konfiguration auch vollständig aktualisieren:

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();
2
Neil Barnwell

Zuerst möchten Sie vielleicht hinzufügen

using System.Configuration;

In Ihre .cs-Datei. Wenn es nicht verfügbar ist, fügen Sie es über die Projektverweise hinzu, da es standardmäßig nicht in einem neuen Projekt enthalten ist.

Dies ist meine Lösung für dieses Problem ..__ Zuerst habe ich die ConnectionProperties-Klasse erstellt, die die Elemente speichert, die in der ursprünglichen Verbindungszeichenfolge geändert werden müssen .. _ Die Variable _name in der ConnectionProperties-Klasse ist wichtig, um der Name des connectionString zu sein Die erste Methode nimmt eine Verbindungszeichenfolge und ändert die gewünschte Option mit dem neuen Wert.

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

Sie können diese Methode an Ihre eigenen Bedürfnisse anpassen. Ich habe sowohl Mysql- als auch Mssql-Verbindungen, also brauchte ich beide. Natürlich können Sie diesen Entwurfscode selbst verfeinern.

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

Da ich keine trivialen Informationen hinzufügen wollte, habe ich den Bereich "Eigenschaften" meines Codes ausgelassen. Bitte fügen Sie es hinzu, wenn Sie möchten, dass dies funktioniert.

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

Ja, wenn ASP.NET web.config aktualisiert wird, wird die gesamte Anwendung neu gestartet. Dies bedeutet, dass web.config neu geladen wird.

1
ajma

// Hier erfahren Sie, wie Sie dies in Windows App.Config tun

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