是否可以在运行时修改配置ConnectionStrings?

时间:2009-03-20 08:59:06

标签: c# configuration web-config app-config connection-string

是否可以在运行时修改app.config / web.config中定义的连接字符串?我想使用不同的配置文件,具体取决于运行app / site的机器(当然,仅用于调试目的。我们将在部署时使用常规配置文件)。

我可以编写AppSettings,但不能编写ConnectionStrings(AFAIK)。或者我可以吗?

5 个答案:

答案 0 :(得分:2)

是的,这是可能的,但AFAIK只能通过Reflection。以下代码应该满足您的需求(请参阅下面的用法):

public static string SetConnectionString(Type assemblyMember,
                                         Type settingsClass,
                                         string newConnectionString,
                                         string connectionStringKey)
{
  Type typSettings = Type.GetType(Assembly.CreateQualifiedName(assemblyMember.Assembly.FullName, settingsClass.FullName));

  if (typSettings == null)
  {
    return null;
  }

  PropertyInfo prpDefault = typSettings.GetProperty("Default", BindingFlags.Static | BindingFlags.Public);

  if (prpDefault == null)
  {
    return null;
  }

  object objSettings = prpDefault.GetValue(null, null);

  if (objSettings == null)
  {
    return null;
  }

  // the default property, this[], is actually named Item
  PropertyInfo prpItem = objSettings.GetType().GetProperty("Item", BindingFlags.Instance | BindingFlags.Public);

  if (prpItem == null)
  {
    return null;
  }

  object[] indexerName = { connectionStringKey };
  string oldConnectionString = (string)prpItem.GetValue(objSettings, indexerName);

  prpItem.SetValue(objSettings, newConnectionString, indexerName);

  return oldConnectionString;
}

assemblyMember是通话类型
settingsClass是您的设置类的类型
newConnectionString是要设置的完整字符串 connectionStringKey是您在应用设置

中定义的连接字符串的名称

您应该在应用启动后尽快调用此方法,最好是在Main()方法中。

答案 1 :(得分:1)

我在我的项目中尝试了一次用于调试目的但是无法做到,问题(我想,如果我错了,请纠正我)是在应用启动app.config被加载到内存中,任何更改到应用程序运行时app.config不会反映出来。

要解决这个问题,请在app.config中定义所有连接字符串,然后在程序运行时调用所需的连接字符串。

例如,假设您在app.config中定义了连接字符串,如下所示。

<connectionStrings>
    <add name="YourNameSpace.Properties.Settings.ConnectionString_1"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

    <add name="YourNameSpace.Properties.Settings.ConnectionString_2"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

</connectionStrings>

定义任意多个(你正在调试:-)) 然后在代码中调用这些连接设置,执行以下操作:

YourNameSpace.Properties.Settings foo = new YourNameSapce.Properties.Settings();

foo.ConnectionString_1;

HTH

最好的问候

@nand

P.S:此回复特定于C#。

答案 2 :(得分:0)

您无法真正编辑正在运行的进程的配置文件。

一个选项(有利有弊)是在machine.config或master web.config中使用配置数据(对于“site”,你使用“location”节点) - 虽然不是一个选项,但是

处理此问题的更好方法是将配置文件作为构建/部署过程的一部分进行交换,理想情况下是自动化的。这样,一切都是自包含的,你可以“robocopy”到一个vanilla服务器并让它工作。


重新获得“每个开发者”的观点;我发现最简单的方法是标准化配置,并调整机器。例如,我们在VM上运行本地Web服务器;我们标准化“localserver”(镜像“localhost”),而不是针对每台机器的代码,并为开发人员可以控制的每台机器添加本地DNS记录。请注意,这需要固定的IP地址(或可能是DHCP保留),以防止它随时间变化!

Ditto数据库;本地服务器可以使用“。”;远程服务器可以在机器上别名,因此“devserver”指向用户想要的任何东西。

只是一个想法...

答案 3 :(得分:0)

本文详细介绍了您的选项:http://aspalliance.com/820

答案 4 :(得分:0)

安装网站时,您可以在NAnt脚本中运行xmlpoke。

E.g。

  1. 在网站上部署NAnt。
  2. 创建一个调用NAnt的go.bat,它安装该站点并执行xmlpoke以使用基于服务器名称或其他参数的设置修改web.config。