Я записал об этом в сообщение на моем блоге . Прием должен использовать отражение, чтобы засунуть значения как способ получить доступ к непубличным полям (и методы).
, например,
var settings = ConfigurationManager.ConnectionStrings[ 0 ];
var fi = typeof( ConfigurationElement ).GetField( "_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic );
fi.SetValue(settings, false);
settings.ConnectionString = "Data Source=Something";
Вы могли поместить его в файл ресурсов вместо этого. Это не будет иметь встроенных функций класса ConfigurationManager, но это будет работать.
Принятие Resources.resx:
Resources.Default.ConnectionString = "Server=myserver;" // etc
Тогда в Вашем коде:
conn.ConnectionString = Resources.Default.ConnectionString
Это - взлом, я знаю.
Я в настоящее время использую внедрение зависимости для обработки различных строк подключения в dev/prod по сравнению с тестовыми средами. Я все еще должен вручную изменить webconfig, если я хочу переместиться в между dev и напоминанием, но для тестирования у меня есть интерфейс IConnectionStringFactory с реализацией по умолчанию, которая смотрит на веб-конфигурацию и альтернативную конфигурацию тестирования, которая возвращает статические значения. Тот путь, когда я тестирую меня просто, установил фабрику на реализацию тестирования, и это возвратит строку подключения тестирования для ключа, который я прошу. Иначе это посмотрит в webconfig.
я мог расширить это до другой реализации для dev по сравнению с напоминанием, но я - более удобное наличие единственной реализации IConnectionStringFactory в моем производственном блоке и реализации тестирования в моем блоке тестирования.
В дополнение к другим ответам, данным, и принятие строки подключения, не просто другая конфигурация, переменная или постоянная в целом, Вы могли бы рассмотреть использование класс SqlConnectionStringBuilder вместо того, чтобы непосредственно связать строку вместе.
РЕДАКТИРОВАНИЕ: Взлеты, извините просто видел, что Вы в основном хотите прочитать свою строку подключения (завершенный, я предполагаю) из другого источника.
ConfigurationManager привык к , читает из файла конфигурации.
Ваше решение состоит в том, чтобы просто установить, ведут. ConnectionString к вести строке Вам нужно.
Я считаю, что это работает для меня:
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection;
if (section != null)
{
section.ConnectionStrings["MyConnectionString"].ConnectionString = connectionString;
config.Save();
}
Это перезаписывает существующую строку подключения.