Модифицировать программно строку подключения в app.config перед запуском сервиса - PullRequest
0 голосов
/ 11 февраля 2012

У меня проблема с программным изменением строки подключения в файле app.config. В переопределенном методе OnStart я хочу изменить файл app.config (только строка подключения) На данный момент у меня есть это:

 private static void ChangeConnectionString(string newDatasource)
    {
        try
        {
            XDocument doc = XDocument.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            var query = from p in doc.Descendants("connectionStrings").Descendants()
                         select p;
            foreach (var child in query)
            {
                foreach (var atr in child.Attributes())
                {
                    if (atr.Name.LocalName == "name" && atr.Value == "UniversityEntities" &&
                        atr.NextAttribute != null && atr.NextAttribute.Name == "connectionString")
                    {
                        SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder();
                        connectionStringBuilder.DataSource = newDatasource;
                        connectionStringBuilder.InitialCatalog = "UniversityDB";
                        connectionStringBuilder.IntegratedSecurity = true;

                        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(atr.NextAttribute.Value);
                        entityBuilder.ProviderConnectionString = connectionStringBuilder.ToString();
                        atr.NextAttribute.Value = entityBuilder.ToString();

                    }
                }

            }
            doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            ConfigurationManager.RefreshSection("connectionString");
        }
        catch (Exception x)
        {
        }
    }

Ответы [ 2 ]

3 голосов
/ 04 июля 2012

Вместо изменения строки подключения, почему бы вам не добавить несколько строк подключения в файл app.config и использовать их в своем коде в соответствии с вашими потребностями.

Вот пример:

//In app.config there are two connection string entry.
<connectionStrings>
<add name="BASE_ConnectionString" connectionString="Data Source=;Initial Catalog=;USER ID=;Password="
  providerName="System.Data.SqlClient" />
  <add name="" connectionString="server=;User Id=;database=;password="
  providerName="MySql.Data.MySqlClient"/> 
</connectionStrings>

Вы можете переключаться между этими двумя записями во время выполнения:

string strTesaConnectionString = ConfigurationManager.ConnectionStrings["TESA_ConnectionString"].ConnectionString;
string strBaseConnectionString = ConfigurationManager.ConnectionStrings["BASE_ConnectionString"].ConnectionString;
if(1)
{
  using (MySqlConnection DBConnection = new MySqlConnection(strTesaConnectionString))
   { ... }
}
if(2)
{
  using (MySqlConnection DBConnection = new MySqlConnection(strBaseConnectionString ))
   { ... }
}
1 голос
/ 11 февраля 2012

Если вы хотите создать пользовательский интерфейс для изменения конфигурации, вы можете сделать это.но это не произойдет в самом приложении.

1-й у вас есть сервис / приложение, которое будет затронуто.Во-вторых, у вас есть другое приложение, которое изменит файл.

, когда администратор нажмет «изменить строку подключения» во втором приложении, второе приложение остановит первую службу / приложение.изменить строку подключения.запустите 1-ю службу / приложение.

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

--------------------------------------

альтернативой является удаление строки подключения дляфайл конфигурации в целом и просто сделайте строку подключения обязательным параметром при запуске приложения.так что если это сервер, он может выглядеть следующим образом

net start [имя службы] "строка подключения ..."

из 2-го пользовательского интерфейса, вы можете просто переписать скрипт bat / psкоторый запускает / останавливает службу.таким образом, вам не нужно взламывать xml файла app.config.

--------------------------------------

один последний комментарий.удалите try / catch, это абсолютно бесполезно, и вам нужно знать, есть ли проблемы при изменении файла.

...