我已经搜索了stackoverflow很长一段时间,并没有找到适合我情况的解决方案,所以我在这里问。
我有一个asp.net网站,需要网络应用程序通过子域名访问不同的SQL Server数据库。
根据url请求subdomian确定访问不同的数据库。
- prj1.test.com prj1 --->使用prj1_DB
- prj2.test.com prj2使用prj2_DB
醇>
我找不到更好的方法来解决这个问题。
我的直觉解决方案:
当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);
我想找到一种更好的方法来解决这个问题。
我上面使用的解决方案是:
将数据库连接字符串从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层中获取该密钥的值。但两层之间存在差距,如何克服这一差距?
答案 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中构建连接字符串。不确定这是否是一种正确的方法,但可能适用于您的情况。