开发者

Runtime dynamic SQL Server database access by different connection strings

I've searched the stackoverflow for a long time and didn't find a solution fit my situation, so I asked here.

I have a single asp.net website, and need the web app to access different SQL Server database by the subdomain name.

According to the url request subdomian to determine the access the different database.

  1. prj1.test.com prj1--->use the prj1_DB
  2. prj2.test.com prj2 use the prj2_DB

I couldn't find a better practice to solve the issue.

My intuition solution:

when the url request coming, get the url subdomain, get the subdomain's db connection string stored in the main db, passing the connection string to the DAL to get the data.

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);

I want to find a better way to solve this problem.

The solution I using above is:

  • get the dbConnectionString from main DB,
  • passing it over the Index.page ->BusinessObject Layer -->DAL Layer

It's so bad that passing the DB connection string from UI page to the DAL layer.

Any ideas?

Update 1开发者_如何学Python: What I really want is: don't pass the db connection string from UI to DAL layer.

I want to find a solution that don't do pass the db connstr from UI to DAL linearly.

Is there some pattern in asp.net to share some variable for UI layer and DAL Layer?

Update 2: if I stored the project db info in a xml file or in the main db, it looks like this

it's a key-value part for the project. here is the question, I get the values all in the main DB or a xml file. How I get the key when I need to access the DB in DAL layer?

in the DAL layer, how to get the correct key for the currnet url request?

it's back to the above, pass the key from UI to DAL. that's I want to avoid.

the real problem is, I can get the key from url request in the UI layer, and I can get the value for that key in the DAL layer. but there is a gap between the two layers, How to conquer this gap?


If you can compute your connection string from a base connection string, then you could do something like this:

  • store the base connection string in your web.config

    <connectionStrings>
       <add name="BaseConnString" 
            connectionString="server=MyServer;database=master;Integrated Security=SSPI;" />
    </connectionStrings>
    
  • load the base connection string into a SqlConnectionStringBuilder in your code:

    string baseConnStr = WebConfigurationManager.ConnectionString["BaseConnString"].ConnectionString;
    SqlConnectionStringBuilder scsBuilder = 
       new SqlConnectionStringBuilder(baseConnStr);
    
  • now, just define the database you want to connect to, e.g. based on something in your URL

    scsBuilder.InitialCatalog = "ProjectDatabase" + ........ ;
    
  • use the resulting complete connection string for your SqlConnection:

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

Check out the MSDN docs on SqlConnectionStringBuilder.

With this approach, you'd store a single "base" connection string in your web.config and this wouldn't be changing, and using SqlConnectionStringBuilder, you can safely and efficiently define and "compute" your real, "dynamic" connection strings at runtime.


How about adding add the connection strings in web.config as:

Subdomain_connectionString

Now read the subdomain from Request:

Reading connection string from web.config in your DL:

ConfigurationManager.ConnectionStrings[Subdomain_connectionString].ConnectionString

Update:

You can also use xml files to store connection string values:

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

Anytime a new project is added/removed this xml file would be updated. Use XPath expressions to parse the xml file.

@Passing Connection string from UI to DAL: Just try to add the System.web namespace to DAL layer. This would give access to Request object in DAL. Now you can get the subdomain and build the connectionstring in DAL itself. Not sure whether this is a right approach, but might work in your case.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜