Выборка данных из нескольких баз данных - PullRequest
1 голос
/ 30 января 2012

У меня есть несколько баз данных, скажем, DB1, DB2, DB3 и MembershipDB.Каждая база данных имеет столбец GUID с именем ApplicationID и набор пользователей, имеющих членство в качестве GUID.Каждый пользователь каждой базы данных изолирован (не имеет отношения) с пользователем другой базы данных.База данных о членстве содержит идентификатор пользователя и идентификатор приложения, пароль, имя пользователя, адрес электронной почты и т. Д.

Мне нужно создать общую систему входа в систему, например, когда пользователь предоставляет свою учетную запись для входа в систему, необходимо выполнить учетную запись из MembershipDB, а его данные следует получить из базы данных, в которой он зарегистрирован.Например: пользователь из DB1 предоставляет свои данные для входа в систему, аутентификация выполняется из членства в DB.Теперь остальная часть его данных должна быть выбрана из DB1 (поскольку он зарегистрирован в DB1) на его приборную панель.Я немного запутался, как построить эту систему входа в систему.С аутентификационной частью проблем нет.Но как подключиться к правильной БД, чтобы получить правильные данные для пользователя.Все ценные комментарии и предложения приветствуются.

Я использую Microsoft SQL SERVER 2008, Entity Framework 4.2 (база данных ist), WCF, asp.net MVC 4

Ответы [ 2 ]

0 голосов
/ 30 января 2012

Если я вас правильно понял, то вам нужно динамически подключаться к разным базам данных без изменения вашего кода.Предположим, у вас есть 2 клиента Customer1 и Customer2.Для этих клиентов вы создали 2 базы данных с именами Database_Customer1 и Database_Customer2.

Сопоставьте структуру сущностей с любой базой данных Клиента с именем CustomerDbSpecificEntities.

Теперь вам нужно добавить следующие строки подключения в ваш.config file.

<add name="Database_Customer1_Entities" connectionString="metadata=res://*/CustomerDbSpecific.csdl|res://*/CustomerDbSpecific.ssdl|res://*/CustomerDbSpecific.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=Customer1ServerName;Initial Catalog=DatabaseCustomer1;Persist Security Info=True;User ID=userid;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
<add name="Database_Customer2_Entities" connectionString="metadata=res://*/CustomerDbSpecific.csdl|res://*/CustomerDbSpecific.ssdl|res://*/CustomerDbSpecific.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=Customer2ServerName;Initial Catalog=DatabaseCustomer2;Persist Security Info=True;User ID=userid;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

В вашем коде на уровне доступа к данным

String ConnectionStringName = MembershipDBProvider.GetConnectionStringNameForCustomer(CustomerName);
using (CustomerDbSpecificEntities context = new CustomerDbSpecificEntities("Name=" + ConnectionStringName))
    {
        //use context here
    }

Создайте таблицу (CustomerDbConnection) в общей базе данных (базе данных членства) для хранения сопоставления имени клиента иего имя строки подключения к базе данных.

'GetConnectionStringNameForCustomer (CustomerName)' выполняет поиск в таблице CustomerDbConnection и возвращает имя строки подключения для данного клиента.Который используется для установления соединения с базой данных конкретного клиента.

Теперь, если в будущем у вас будет новый клиент, необходимо внести следующие изменения: 1. Добавить новую строку в CustomerDbConnection.2. Добавьте новую строку подключения в файл .config

Пожалуйста, дайте мне знать, если вам нужно более подробно об этом.

0 голосов
/ 30 января 2012

в БД члена-участника, у вас должен быть столбец, в котором указывается, к какой базе данных будет использовано это использование, например: id, имя пользователя, пароль, applicationid, email, DBName

select * from membershipdb where username='user1', and password = 'password1'.
//Code to fetch the database
//rs = recordset
//This assume these two database in same server
String DB = rs.getString(6) // 6 is DBName

DBobj->executeQuery("USE "+DB);
DBobj->executeSelect("select * from DB1.Table1 where Column1 = 'column1'");

// если база данныхнаходятся на разных серверах, вы можете подключиться к серверу 2 и назначить DBobj2 // Затем используйте метод, аналогичный описанному выше

...