如何动态更改web.config中的连接字符串

6

我在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#中动态更改连接字符串


你想要在页面上更改使用的连接字符串,还是想要更改Web.config文件中的连接字符串? - CBRRacer
使用场景是什么?我猜你可能想使用ASP.Net Membership。如果我错了,我很抱歉。 - npclaudiu
更改 web.config 中的连接字符串。 - user787951
我的应用程序被不同的客户使用,每个客户都有自己的数据库。当用户登录时,根据他们的域名和端口地址,我们将从数据库中检索连接字符串(近250个连接字符串),用于连接到数据库。这是一个好的方法吗?还是有其他最佳实践? - user787951
5个回答

10

配置是只读的,所以你不能像显而易见的方式那样进行操作。


ConfigurationManager.ConnectionStrings["student"].ConnectionString = "new value";

这会引发一个 System.Configuration.ConfigurationErrorsException 异常,该异常提示 "Configuration is read only"。

以下是使用反射重置配置元素的readOnly属性的技巧。 详细内容请参见Programmatically setting a connectionString property

代码片段:

var settings = ConfigurationManager.ConnectionStrings[ 0 ];
var fi = typeof(ConfigurationElement).GetField(
              "_bReadOnly", 
              BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(settings, false);
settings.ConnectionString = "Data Source=Something";

顺便问一下,为什么你需要改变这个配置?我感觉你可能正在错误的方式下尝试解决问题。


我的应用程序被不同的客户使用,每个客户都有自己的数据库。当用户登录时,根据他们的域名和端口地址,我们将从数据库中检索相应的连接字符串(近250个连接字符串),以连接到数据库。这种方法好吗?还有其他最佳实践吗? - user787951

3
您可以使用WebConfigurationManager.OpenWebConfigurationWebConfigurationManager.OpenMappedWebConfiguration打开您的Web.Config文件进行读写。只要具有写权限,您就可以进行修改,例如更改连接字符串。

这肯定比使用反射来修改私有字段好。

修改web.config将会重新启动Web应用程序,因此这不适用于让用户更改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();
}

如何修改它...我使用了Section.Connectionstring= "datasource",但是它给了我一个错误。 - user787951
@Gani,类似于section.ConnectionStrings["MyName"].ConnectionString = "..."这样的东西。 - Joe

1
在Web Confige中放置以下代码。
<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");

0
如果用户能够更改设置的值,则 web.config 文件不是存储该设置的正确位置。
您应该查看设置文件中的用户范围值。 MSDN - 使用 C 中的设置 使用此类设置时,运行时更改值很容易:
Properties.Settings.Default.ConnectionStringName = "New Connection String";
Properties.Settings.Default.Save();

0
使用命名空间
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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接