С# Изменить строку подключения, которая существует внутри библиотеки

У меня есть библиотека классов, внутри которой есть только набор данных (соединитель MySQL) и класс соединителя.

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

Как я могу изменить эту строку подключения.

Я пробовал следующее

Properties.Settings.Default.DataBaseConnectionString = "String";

Но кажется, что строка подключения доступна только для чтения, потому что у нее нет значения установщика.

Я также пробовал следующее без везения

Properties.Settings.Default.DatabaseConnectionString.Insert(
Properties.Settings.Default.DatabaseConnectionConnectionString.Length - 1,
            "Password=dbpassword;");

person Michal Ciechan    schedule 07.04.2010    source источник


Ответы (4)


Вы можете изменить их следующим образом:

Properties.Settings.Default["MyConnectionString"] = newCnnStr;

Для полного решения, которое также сохраняет новое значение в файл, вам нужно сделать что-то вроде этого:

    private static void ModifyConnectionStrings()
    {
        // Change the value in the config file first
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        const string newCnnStr = "server=(local);database=MyDb;user id=user;password=secret";
        config.ConnectionStrings.ConnectionStrings["MyProject.Properties.Settings.MyConnectionString"].ConnectionString = newCnnStr;
        config.Save(ConfigurationSaveMode.Modified, true);

        // Now edit the in-memory values to match
        Properties.Settings.Default["MyConnectionString"] = newCnnStr;
    }

Если ваш набор данных находится в другой сборке, вы все равно можете сделать это, сделав настройки для этой сборки общедоступными. Сделать это:

  1. Щелкните правой кнопкой мыши проект в обозревателе решений и выберите Свойства.
  2. Перейдите на вкладку Настройки.
  3. Измените раскрывающийся список Модификатор доступа на «Общий», сохраните и закройте.

Затем вы можете сделать это (при условии, что другой проект называется «MyProject.DataLayer»):

    private static void ModifyConnectionStrings()
    {
        // Change the value in the config file first
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        const string newCnnStr = "server=(local);database=MyDb;user id=user;password=secret";
        config.ConnectionStrings.ConnectionStrings["MyProject.Properties.Settings.MyConnectionString"].ConnectionString = newCnnStr;
        config.ConnectionStrings.ConnectionStrings["MyProject.DataLayer.Properties.Settings.MyConnectionString"].ConnectionString = newCnnStr;
        config.Save(ConfigurationSaveMode.Modified, true);

        // Now edit the in-memory values to match
        Properties.Settings.Default["MyConnectionString"] = newCnnStr;
        MyProject.DataLayer.Properties.Settings.Default["MyConnectionString"] = newCnnStr;
    }
person Neil Barnwell    schedule 07.04.2010
comment
Только что обновлено для учета строк подключения для других сборок (т.е. если у вас есть проект уровня данных с наборами данных). - person Neil Barnwell; 07.04.2010
comment
Я не думал, что использование индексатора [] заставит его работать так, как я ожидал, используя его имя значения. Вы не представляете, насколько это мне помогло :) Я только что закончил миграцию базы данных в MySQL из соображений безопасности и не мог понять, как использовать разные имена пользователей/пароли в строке подключения во время выполнения. - person Michal Ciechan; 07.04.2010

У вас нет исходного кода этого класса?

Кроме того, но немного более сложный метод, это исправить сборку с помощью Reflector с Reflexil Дополнение.

person Bobby    schedule 07.04.2010
comment
У меня есть исходный код, это мой собственный проект. Но я не могу понять, как изменить строку подключения. - person Michal Ciechan; 07.04.2010

Я думаю, вы спрашиваете, как вы можете изменить свойства строки подключения во время выполнения в зависимости от того, кто использует приложение. Надеюсь это поможет.

В прошлом я делал это, заставляя мою строку подключения содержать параметры, которые я могу предоставить с помощью string.Format.

    <connectionStrings>
        <add name="SomeDB" connectionString="("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Database Password={1}"" />
    </connectionStrings>

string connectionString = string.Format(ConfigurationManager.ConnectionStrings["SomeDB"].ConnectionString, location, password);
person Wil P    schedule 07.04.2010
comment
Это кажется идеальным, но как я могу заставить свой набор данных и все мои адаптеры подключаться/повторно подключаться, используя эту строку? - person Michal Ciechan; 07.04.2010
comment
Однако это не сработает для var adapter = new MyTableAdapter(), потому что это загрузит значения непосредственно из файла. Вам придется явно создавать объекты Connection и каждый раз устанавливать свойство TableAdapter.Connection. - person Neil Barnwell; 07.04.2010
comment
Если вы посмотрите на ответ Нила Барнвелла, вы можете использовать Properties.Settings.Default[MyConnectionString] и автоматически обновлять все адаптеры таблиц, которые используют эту строку подключения. - person Michal Ciechan; 07.04.2010
comment
Круто, приятно знать. Я думаю, что пропустил эту часть вашего вопроса: / В любом случае, я рад, что у вас есть ответ. - person Wil P; 07.04.2010

Похоже, вы загружаете строку подключения из файла конфигурации, вы сможете изменить ее оттуда. После создания это будет файл с тем же именем, что и ваша скомпилированная форма, плюс .config. (Например, application.exe.config)

person Guvante    schedule 07.04.2010
comment
Я не знаю, почему я получил отрицательный голос, их можно изменить во время выполнения, но обычно для строк подключения они меняются достаточно редко, чтобы работало изменение конфигурации вне приложения. Не говорю, что это лучший ответ, но отрицательный голос был резким, ИМО. - person Guvante; 07.04.2010
comment
Я не понизил вас, но вам нужно более внимательно прочитать вопрос: мне нужно иметь возможность изменить эту строку ... чтобы я мог подключить пользователя, используя свою учетную запись. - person Neil Barnwell; 22.04.2010
comment
Эта точная строка идеально подходит для бизнес-ориентированного приложения, которое обслуживает ИТ-персонал. У кого не возникнет проблем с изменением XML в файле .config. Или, черт возьми, это может быть установлено установочным файлом, в любом случае модификация вне вашего приложения - неплохая идея. - person Guvante; 23.04.2010