【问题标题】:Dynamic Connecton String Based on Session Variable基于会话变量的动态连接字符串
【发布时间】:2010-12-08 00:20:14
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案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 检索的所有值。这将允许您封装“切换”在一个地方返回的实际值所需的任何逻辑(例如上面的“基于机器名称的连接字符串”技巧),并允许您使用自定义类的“连接字符串” " 需要连接字符串作为参数的任何其他组件的构造函数中的属性,而无需在实际连接字符串值更改时更改此属性。

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

    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

    【讨论】:

    • 感谢您提供信息丰富的评论!我知道连接字符串技巧,但是,我的情况有点不同。我需要一个基于用户的不同连接字符串,并且可能还有他们对应用程序所针对的数据库的选择。换句话说,它不仅仅是一个部署开关或我可以在 Application_Start 期间设置的设置。如果我可以用我自己的覆盖当前的连接字符串配置部分,那么制作自定义配置部分将是完美的。我正在寻找这样做的信息,但还没有拉任何东西。
    • 这是一个好主意.. 不是将会话字符串传递给每个连接时刻,您可以使用可以处理 asp.net 内部的特殊部分来获取用户会话并提供连接字符串。这只能在生产中完成......干杯
    【解决方案2】:

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

    【讨论】:

    • 这与我现在正在做的方法非常相似。不幸的是,我认为它不会在当前情况下起作用。许多对象接受连接字符串名称(而不是连接字符串)作为参数,这基本上使我无法控制。
    • 你可以做同样的事情,但不是返回连接字符串,而是返回连接字符串名称?您指的是哪种对象接受 conn 字符串名称?这些是自定义对象还是内置 ASP.Net 控件?
    • 它们是 asp.net 控件,例如 Asp.Net SqlCacheDependency Object,它接受架构中的注册名称(然后引用连接字符串名称)。如果我使用连接字符串名称做同样的事情,我将不得不在 web.config 中注册连接字符串的每个实例,而不是动态的。这很像 JustLoren 的建议。
    • 我脑子里想不出任何东西。这可能有一些用处:stackoverflow.com/questions/158783/…
    • 你也可以使用SqlCommand对象来创建一个CacheDependency,这样会更容易动态改变,但是对于其他你做不到的对象当然无济于事。
    【解决方案3】:

    您似乎可以只为连接字符串命名,然后传递该重要名称:生产、测试​​等。

    您的 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());
    

    【讨论】:

    • 我已经考虑过这种方法,但是,生成“假设”的过程超出了我的控制范围,我希望避免为每次生成手动添加这些设置。这是一个很好的方法,我将其作为最后的手段。
    【解决方案4】:

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

    【讨论】:

    • 这与我当前的实现非常相似,但是,它不符合我当前的需要。基本上,我正在尝试使用接受连接字符串名称作为其构造函数的一部分的控件,这使我无法控制连接字符串的构建部分。我想覆盖默认的构建过程以适应我自己的目的,但我不确定如何做到这一点。这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多