Динамический доступ к базе данных SQL Server по разным строкам соединения - PullRequest
2 голосов
/ 27 марта 2011

Я долго искал стековый поток и не нашел решения, подходящего для моей ситуации, поэтому я спросил здесь.получить доступ к другой базе данных SQL Server по имени субдомена.

В соответствии с запросом URL субдомина для определения доступа к другой базе данных.

  1. prj1.test.com prj1---> использовать prj1_DB
  2. prj2.test.com prj2 использовать prj2_DB

Я не смог найти более подходящую практику для решения проблемы.

Мое интуитивное решение:

когда приходит запрос url, получить поддомен url, получить строку соединения 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 Layer -> Уровень DAL

Это так плохо, что передача строки подключения к БД со страницы пользовательского интерфейса на уровень DAL.

Есть идеи?

Обновление 1: Что я действительно хочу, так это: не передавать строку соединения с БД из пользовательского интерфейса на уровень DAL.

Я хочу найти решение, которое не передает БД connstr из пользовательского интерфейса вDAL линейно.

Есть ли в asp.net какой-то шаблон для совместного использования некоторой переменной для слоя пользовательского интерфейса и слоя DAL?

Обновление 2: , если я сохранил информацию о базе данных проекта в xmlфайл или в основной базе данных, это выглядит так:

это часть значения ключа для проекта.вот вопрос, я получаю все значения в основной БД или в XML-файле. Как получить ключ, когда мне необходимо получить доступ к БД на уровне DAL ?

на уровне DAL, как получить правильный ключ для запроса URL-адреса currnet?

вернемся к вышесказанному, передайте ключ от UI к DAL.этого я хочу избежать.

реальная проблема в том, что я могу получить ключ из URL-запроса на уровне пользовательского интерфейса и получить значение этого ключа на уровне DAL.но есть разрыв между двумя слоями, как преодолеть этот разрыв?

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Если вы можете вычислить строку подключения из базовой строки подключения, то вы можете сделать что-то вроде этого:

  • сохранить строку базового соединения в вашем 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);
    
  • Теперь просто определите базу данных, к которой вы хотите подключиться, например, основанный на чем-то в вашем URL

    scsBuilder.InitialCatalog = "ProjectDatabase" + ........ ;
    
  • используйте полученную полную строку подключения для вашего SqlConnection:

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

Проверьте документы MSDN на SqlConnectionStringBuilder .

При таком подходе вы сохраняете одну «базовую» строку соединения в вашем web.config, и это не изменится, а с помощью SqlConnectionStringBuilder вы можете безопасно и эффективно определять и «вычислять» ваш реальный, «динамические» строки подключения во время выполнения.

0 голосов
/ 27 марта 2011

Как насчет добавления добавить строки подключения в web.config как:

Subdomain_connectionString

Теперь читать поддомен из запроса:

Чтение строки подключения из web.config в вашем DL:

ConfigurationManager.ConnectionStrings[Subdomain_connectionString].ConnectionString

Обновление:

Вы также можете использовать XML-файлы для хранения значений строки подключения:

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

Каждый раз, когда новый проект добавляется / удаляется, этот XML-файл будет обновляться. Используйте выражения XPath для разбора файла xml.

@ Передача строки подключения из пользовательского интерфейса в DAL : Просто попробуйте добавить пространство имен System.web в слой DAL. Это даст доступ к объекту запроса в DAL. Теперь вы можете получить поддомен и построить строку подключения в самом DAL. Не уверен, что это правильный подход, но может сработать в вашем случае.

...