基于会话变量的动态连接字符串

时间:2009-10-19 14:07:21

标签: asp.net web-config connection-string

我有一个应用程序,可以在一段时间内为我的客户端进行数据投影。为了让客户能够“玩”其他场景而不会弄乱生产数据,他们可以随时选择替代数据库(基本上是假设情景),这是生产数据库的副本。给定的时间。目前,我有一些代码,基本上在连接字符串上进行字符串替换,根据存储在会话状态中的用户选择,热交换服务器名称和数据库名称。

这种方法适用于我正在做的事情,虽然它确实需要我在每一层中传递这些选择。这是我的问题:我希望能够创建一个自定义连接字符串,在后台处理这个'切换',并允许我使用连接字符串,就像我在标准的Asp.Net应用程序中一样。

换句话说,许多asp.net工具只接受连接字符串名称作为其构造函数的一部分。我希望能够利用这些工具,但不能像我目前构建我的连接字符串那样b / c。有没有办法在用户会话级别支持此行为?

4 个答案:

答案 0 :(得分:1)

有许多不同的方法可以解决这个问题。

有些人拥有完整的web.config文件副本(应保留连接字符串)并使用构建后事件,他们可以根据“发布配置”复制相关的web.config文件你在Visual Studio中使用。

此方法由Scott Gu和blogged about提供others 另外,请参阅此StackOverflow问题:
How do you deal with connection strings when deploying an ASP.NET site?

现在,以上是最初部署 ASP.NET应用程序的好方法,但是,如果要在已部署的情况下执行此操作,可以使用这个方便的机制: ConnectionString Trick

听起来你已经做了与此非常相似的事情,如果你想在运行时动态切换数据库,我认为你能做的最好就是在代码中“切换”连接字符串。当然,这里的技巧是简化这一过程,以便应用程序中只有一个地方负责为应用程序的其余部分提供数据库连接字符串。

处理此问题的最佳方法可能是确保使用派生自System.Configuration.ConfigurationSection类的类检索您希望从web.config检索的所有值。这将允许您封装“切换”在一个地方返回的实际值所需的任何逻辑(例如上面的“基于连接字符串的机器名称”技巧),并允许您使用自定义类的“connectionstring” “任何其他组件的构造函数中的属性,需要连接字符串作为参数,而不必在实际连接字符串值更改时更改此值。

自定义配置部分的一些好资源是:

How to: Create Custom Configuration Sections Using ConfigurationSection
Creating Custom Configuration Sections in Web.config Using .NET 2.0's Configuration API
Custom Configuration Sections in 3 Easy Steps

答案 1 :(得分:0)

似乎你可以只显着地命名你的连接字符串,然后传递这个重要名称:生产,测试等。

您的web.config中可能包含所有连接字符串,然后您只需根据名称检索连接字符串。

<add name="Production" connectionString="Database=Widgets;Server=SQL-PROD;Trusted_Connection=yes" />
<add name="Test" connectionString="Database=AltWidgets;Server=SQL-TEST;Trusted_Connection=yes" />

当您建立连接时,只需传递它:

SqlConnection conn = new conn(ConfigurationManager.ConnectionStrings[Session["SelectedDB"]].ToString());

答案 2 :(得分:0)

您可以创建自定义对象,覆盖ToString方法,并将myObject.ToString()作为这些对象的参数传递,例如。

class CustomObject
{
    override public string ToString()
    {
         // In here would go whatever logic you use to decide 
         // which conn string should be returned
         return "Data Source=server; User ID=user; Password=password;" + 
                   "Initial Catalog=" + Session["DBName"];
    }
}

然后使用它:

CustomObject co = new CustomObject();
SqlConnection conn = new SqlConnection(co.ToString());

答案 3 :(得分:0)

我认为System.Data.SqlClient.SqlConnectionStringBuilder将完全满足您的需求。