Asp.net 基于会话变量的动态Connecton字符串

Asp.net 基于会话变量的动态Connecton字符串,asp.net,web-config,connection-string,Asp.net,Web Config,Connection String,我有一个应用程序,可以在一段时间内为我的客户进行数据投影。为了允许客户在不破坏生产数据的情况下“播放”其他场景,他们可以在任何时候选择替代数据库(基本上是假设场景),这些数据库是给定时间内生产数据库的副本。目前,我有一些代码,基本上是在连接字符串上进行字符串替换,这将根据存储在会话状态中的用户选择热交换服务器名称和数据库名称 这种方法对于我正在做的工作非常有效,尽管它确实需要我在每一层中传递这些选择。我的问题是:我希望能够创建一个自定义连接字符串,在后台处理这种“切换”,并允许我像在标准Asp.

我有一个应用程序,可以在一段时间内为我的客户进行数据投影。为了允许客户在不破坏生产数据的情况下“播放”其他场景,他们可以在任何时候选择替代数据库(基本上是假设场景),这些数据库是给定时间内生产数据库的副本。目前,我有一些代码,基本上是在连接字符串上进行字符串替换,这将根据存储在会话状态中的用户选择热交换服务器名称和数据库名称

这种方法对于我正在做的工作非常有效,尽管它确实需要我在每一层中传递这些选择。我的问题是:我希望能够创建一个自定义连接字符串,在后台处理这种“切换”,并允许我像在标准Asp.Net应用程序中一样使用连接字符串


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

似乎您可以直接命名连接字符串,然后传递这个重要的名称:生产、测试等

您的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" />

您可以创建一个自定义对象,重写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());

我认为
System.Data.SqlClient.SqlConnectionStringBuilder
将非常适合您的需要。

有许多不同的处理方法

有些人拥有其web.config文件的完整单独副本(连接字符串应保存在其中),并且使用生成后事件,他们可以根据您在Visual Studio中使用的“发布配置”复制相关的web.config文件

Scott Gu也采用了这种方法。
另外,请参见此StackOverflow问题:

现在,在最初部署ASP.NET应用程序时,上述方法是很好的方法,但是,如果您想在应用程序已部署时执行此操作,可以使用此方便的机制:

听起来您已经在做类似的事情了,如果您希望能够在运行时动态切换数据库,我认为最好的方法就是在代码中“切换”连接字符串。当然,这里的诀窍是简化它,这样应用程序中只有一个地方负责向应用程序的其余部分提供数据库连接字符串

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

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




我考虑过这种方法,但是,生成“假设”的过程超出了我的控制,我希望避免为每个生成手动添加这些设置。这是一个很好的方法,我将它作为我的最后手段。这与我现在所做的方法非常相似。不幸的是,我认为在目前的情况下这是行不通的。许多对象接受连接字符串名称(与连接字符串相反)作为参数,这基本上使它不受我的控制。您可以做同样的事情,但不是返回连接字符串,而是返回连接字符串名称?您指的是哪类接受conn字符串名称的对象?这些是自定义对象还是内置ASP.Net控件?它们是ASP.Net控件,例如ASP.Net SqlCacheDependency对象,它接受架构中的注册名称(然后引用连接字符串名称)。如果使用连接字符串名称执行相同的操作,则必须在web.config中注册连接字符串的每个实例,而不是动态的。这很像JustLoren的建议,我脑子里想不出任何东西。这可能有一些用处:您还可以使用SqlCommand对象创建CacheDependency,这将更易于动态更改,但这当然对其他无法更改的对象没有帮助。这与我当前的实现非常类似,但是,它不符合我当前的需要。基本上,我正在尝试使用接受连接字符串名称作为其构造函数一部分的控件,这将使连接字符串的构建部分脱离我的控制。我想覆盖默认的构建过程以满足我自己的目的,但我不确定如何做到这一点。这有意义吗?谢谢你的评论!我知道连接字符串的技巧,但是,我的情况只是有点不同。我需要一个不同的连接字符串,这取决于用户以及他们希望应用程序指向哪个数据库的选择。换句话说,它不仅仅是一个部署开关或一个我可以在应用程序启动期间设置的设置。如果我可以用自己的连接字符串配置部分覆盖当前的连接字符串配置部分,那么创建自定义配置部分将是完美的。我正在寻找这样做的信息,但还没有拉任何东西。这是一个好主意。。而不是将会话字符串传递给
CustomObject co = new CustomObject();
SqlConnection conn = new SqlConnection(co.ToString());