#c# #web-config
#c# #web-config
Вопрос:
Я определяю строку подключения в web.config
<ConnectionStrings>
<add name="student" connectionString="Server=student;Max Pool Size=300;Initial Catalog=studentDB;User ID=student;Password=st123dent;" providerName="System.Data.SqlClient"/>
</Connectionstrings>
как я могу динамически изменять строку подключения в c#
Комментарии:
1. вы хотите изменить строку подключения, которую используете на странице, или вы хотите изменить строку подключения в файле web.config?
2. Каков контекст использования? Я подозреваю, что вы можете захотеть использовать ASP.Net Членство . Прошу прощения, если я ошибаюсь.
3. измените строку подключения в web.config
4. мой applicatin используется разными сетями, у каждого из которых есть своя БД, когда пользователь входит в систему в зависимости от своего доменного имени, адреса порта, мы извлекаем строку соединения из БД (около 250 строк подключения), которая используется для подключения к DB.is это хороший способ ? или любая другая лучшая практика?
Ответ №1:
Конфигурация доступна только для чтения, поэтому вы не можете сделать это очевидным образом, например
ConfigurationManager.ConnectionStrings["student"].ConnectionString = "new value";
Это поднимает систему.Конфигурация.Исключение ConfigurationErrorsException, в котором говорится, что «Конфигурация доступна только для чтения».
Вот трюк, использующий отражение для сброса атрибута только для чтения элемента конфигурации. Смотрите Эту статью для получения полной информации о программной настройке свойства ConnectionString
Фрагмент кода:
var settings = ConfigurationManager.ConnectionStrings[ 0 ];
var fi = typeof(ConfigurationElement).GetField(
"_bReadOnly",
BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(settings, false);
settings.ConnectionString = "Data Source=Something";
Кстати, зачем вам нужно менять конфигурацию? Я чувствую, что вы пытаетесь решить какую-то проблему неправильным способом.
Комментарии:
1. мой applicatin используется разными сетями, у каждого из которых есть своя БД, когда пользователь входит в систему в зависимости от своего доменного имени, адреса порта, мы извлекаем строку соединения из БД (около 250 строк подключения), которая используется для подключения к DB.is это хороший способ ? или любая другая лучшая практика?
Ответ №2:
Вы можете открыть свой файл Web.Config для чтения и записи с помощью WebConfigurationManager.OpenWebConfiguration
или WebConfigurationManager.OpenMappedWebConfiguration
. И при условии, что у вас есть разрешение на запись, вы сможете вносить изменения, такие как изменение строки подключения.
Это, безусловно, должно быть лучше, чем использовать отражение для изменения частного поля.
Изменение web.config приведет к перезапуску веб-приложения, поэтому это не подходит для того, чтобы позволить пользователям вносить изменения в web.config, хотя его можно использовать в определенных сценариях, таких как развертывание.
Пример:
var configurationFileInfo = new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
var vdm = new VirtualDirectoryMapping(configurationFileInfo.DirectoryName, true, configurationFileInfo.Name);
var wcfm = new WebConfigurationFileMap();
wcfm.VirtualDirectories.Add("/", vdm);
Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
ConnectionStringsSection section = config.GetSection("connectionStrings")
as ConnectionStringsSection;
if (section != null)
{
... modify the section ...
config.Save();
}
Комментарии:
1. как это изменить .. я использовал раздел . Connectionstring= «источник данных», это выдает ошибку
2. @Gani, что-то вроде
section.ConnectionStrings["MyName"].ConnectionString = "..."
.
Ответ №3:
в веб-конфигурации поместите этот код
<add name="yourconnectionname" connectionString="Data Source={0};Initial Catalog={1};User ID={2};Password={3}" providerName="System.Data.SqlClient"/>
в вашем соединении поместите этот код
string ScrtCon = ConfigurationManager.ConnectionStrings["yourconnectionname"].ToString();
ScrtCon = string.Format(ScrtCon, "Server Name","Data base Name", "Database User Name", "Database password");
Ответ №4:
Если пользователь может изменить значение параметра, то файл web.config является неправильным местом для хранения параметра.
Вместо этого вы должны проверить пользовательское значение в файле настроек.
MSDN — использование настроек в C
При использовании подобных настроек легко изменить значение во время выполнения:
Properties.Settings.Default.ConnectionStringName = "New Connection String";
Properties.Settings.Default.Save();
Ответ №5:
Использовать пространство имен
using System.Configuration;
using System.Web.Configuration;
void ConfigurnewConnectionString(string server, string database, string userid, string password)
{
string str = "server=" server ";database=" database "; User ID=" userid "; Password=" password "";
//Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
//str = System.Web.Configuration.WebConfigurationManager.AppSettings["myKey"];
//myConfiguration.Save();
System.Configuration.Configuration Config1 = WebConfigurationManager.OpenWebConfiguration("~");
ConnectionStringsSection conSetting = (ConnectionStringsSection)Config1.GetSection("connectionStrings");
ConnectionStringSettings StringSettings = new ConnectionStringSettings("conn", "Data Source=" server ";Database=" database ";User ID=" userid ";Password=" password ";");
conSetting.ConnectionStrings.Remove(StringSettings);
conSetting.ConnectionStrings.Add(StringSettings);
Config1.Save(ConfigurationSaveMode.Modified);
//Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
//myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text;
//myConfiguration.Save();
}