运行时动态SQL Server数据库访问不同的连接字符串

时间:2011-03-27 08:51:55

标签: sql-server connection-string

我已经搜索了stackoverflow很长一段时间,并没有找到适合我情况的解决方案,所以我在这里问。

我有一个asp.net网站,需要网络应用程序通过子域名访问不同的SQL Server数据库。

根据url请求subdomian确定访问不同的数据库。

  
      
  1. prj1.test.com prj1 --->使用prj1_DB
  2.   
  3. prj2.test.com prj2使用prj2_DB
  4.   

我找不到更好的方法来解决这个问题。

我的直觉解决方案:

当url请求到来时,获取url子域,获取存储在主db中的子域的db连接字符串,将连接字符串传递给DAL以获取数据。

Index.aspx.cs

DataTable  dt = ProjectObject.GetProjectIndexNotice(new object[] { 0, CurrentProject.DbConnectionString });  

ProjectObject.cs

public static DataTable GetProjectIndexNotice(object[] param)
{
   ProjectDLC obj = new ProjectDLC();
   return obj.GetProjectIndexNotice(param);
} 

ProjectDAL.cs

public DataTable GetProjectIndexNotice(object[] param)
{
   return base.GetDataTableFromDatabase(param, "NEMP_GetProjectIndexNotice");
} 

DALBase.cs

DataBase db = new Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase(CurrentProject.DbConnectionString);

我想找到一种更好的方法来解决这个问题。

我上面使用的解决方案是:

  • 从主数据库获取dbConnectionString,
  • 将其传递到 Index.page - > BusinessObject图层 - > DAL图层

将数据库连接字符串从UI页面传递到DAL层非常糟糕。

有什么想法吗?

更新1: 我真正想要的是:不要将数据库连接字符串从UI传递到DAL层。

我想找到一个解决方案,它不会将db connstr从UI线性传递到DAL。

asp.net中是否有一些模式可以为UI层和DAL层共享一些变量?

更新2: 如果我将项目db info存储在xml文件或主db中,它看起来像这样

它是该项目的关键价值部分。这是问题,我在主DB或xml文件中获取所有值。 当我需要访问DAL层中的数据库时,我如何获得密钥

在DAL层中,如何获取currnet网址请求的正确密钥

它回到上面,将密钥从UI传递给DAL。那是我想避免的。

真正的问题是,我可以从UI层中的url请求获取密钥,并且我可以在DAL层中获取该密钥的值。但两层之间存在差距,如何克服这一差距?

2 个答案:

答案 0 :(得分:1)

如果您可以从基本连接字符串中计算您的连接字符串,那么您可以执行以下操作:

  • 将基本连接字符串存储在web.config

    <connectionStrings>
       <add name="BaseConnString" 
            connectionString="server=MyServer;database=master;Integrated Security=SSPI;" />
    </connectionStrings>
    
  • 将基本连接字符串加载到代码中的SqlConnectionStringBuilder

    string baseConnStr = WebConfigurationManager.ConnectionString["BaseConnString"].ConnectionString;
    SqlConnectionStringBuilder scsBuilder = 
       new SqlConnectionStringBuilder(baseConnStr);
    
  • 现在,只需定义要连接的数据库,例如基于您网址中的内容

    scsBuilder.InitialCatalog = "ProjectDatabase" + ........ ;
    
  • 使用SqlConnection生成的完整连接字符串:

    using(SqlConnection _con = new SqlConnection(scsBuilder.ConnectionString))
    {
       // do something
    }
    

查看MSDN docs on SqlConnectionStringBuilder

使用这种方法,您可以在web.config中存储一个“基本”连接字符串,这不会改变,使用SqlConnectionStringBuilder,您可以安全有效地定义和“计算” “运行时真正的”动态“连接字符串。

答案 1 :(得分:0)

如何在web.config中添加连接字符串,如下所示:

<强> Subdomain_connectionString

现在来自请求的read the subdomain

从DL中的web.config读取连接字符串:

ConfigurationManager.ConnectionStrings[Subdomain_connectionString].ConnectionString

<强>更新

您还可以使用xml文件存储连接字符串值:

<ROOT>
<Project_1>
<IPAddress></IPAddress>
<DBName></DBName>
...
</Project_1>
<Project_2>
....
</ROOT>

无论何时添加/删除新项目,都会更新此xml文件。使用XPath表达式解析xml文件。

@Passing从UI到DAL的连接字符串:只是尝试将System.web命名空间添加到DAL层。这将允许访问DAL中的Request对象。现在,您可以获取子域并在DAL中构建连接字符串。不确定这是否是一种正确的方法,但可能适用于您的情况。