Базы данных Multiple запроса с единственным запросом ado.net

У меня есть дистрибутивная архитектура DB, где данные хранятся в нескольких SQL-серверах.

как может я действительно выбирать/обновлять/удалять путем выполнения единого запроса. например, "выбор * от сотрудников" должен возвратить данные из всех баз данных, которые я имею.

Как может записать единый запрос, которые натыкаются на несколько SQL-серверов, и получает единственное объединенное представление к моему веб-серверу.

Примечание: Так как количество SQL-серверов может измениться в варьировавшиеся времена, таким образом, я ищу что-то еще, чем связанные запросы начиная с управления связанными запросами в масштабе (или вниз) являются большой болью

6
задан user72486 30 December 2009 в 16:22
поделиться

4 ответа

Для взаимодействия с различными базами данных/соединениями вам понадобится распределенная транзакция через TransactionScope; к счастью, на самом деле это легче , чем db-транзакции (хотя вам нужна ссылка на System. Transactions.dll):

using(TransactionScope tran = new TransactionScope()) {
    // lots of code talking to different databases / connections
    tran.Complete();
}

Кроме того, TransactionScope естественным образом гнездится, и SqlConnection присоединяется автоматически, что делает его действительно простым в использовании.

.
6
ответ дан 10 December 2019 в 02:48
поделиться

Используйте TransactionScope.

Если вы открываете соединения с разными серверами в области действия, то транзакция будет отнесена к распределенной.

Пример:

using (TransactionScope scope = new TransactionScope())
{
    conn1.Open(); //Open connection to db1
    conn2.Open(); //Open connection to db2

    // Don't forget to commit the transaction so it won't rollback
    scope.Complete()
}
3
ответ дан 10 December 2019 в 02:48
поделиться

Нельзя делать то, что вам нужно, с одним запросом, если только вы не хотите вставить посредника какого-нибудь типа, например, экземпляр SQL Express, который будет посредником с другими серверами, возможно, используя SQL CLR. Но это грязно.

Было бы гораздо проще просто выдать кучу асинхронных запросов, а затем объединить ответы в один DataTable (или эквивалент), когда они поступят. С помощью нативных асинхронных вызовов в стиле ADO.NET все запросы могут выполняться параллельно. Разумеется, при считывании данных в один DataTable необходимо использовать блокировку.

.
0
ответ дан 10 December 2019 в 02:48
поделиться

Лучшим решением здесь является использование виртуальной СУБД для объединения нескольких бэкендов в один видимый бэкенд - поэтому запрос направляется в виртуальную СУБД, которая затем перенаправляет его соответствующим образом к реальным хранилищам данных.

OpenLink Virtuoso - это один из вариантов. Virtuoso открывает соединения с любым источником данных, доступным через ODBC (включая JDBC, через мост ODBC-JDBC)

Ваши приложения, потребляющие данные, могут подключаться к Virtuoso через ODBC, JDBC, OLE-DB или ADO.NET по мере необходимости. Все удаленные связанные объекты (таблицы, виды, хранимые процедуры и т.д.) доступны через все механизмы доступа к данным.

Хотя вы можете достичь аналогичных результатов, используя другие методы, описанные здесь, они требуют от конечного пользователя знать все о внутренних структурах данных, а также оптимизировать запросы самостоятельно. В Virtuoso встроенный оптимизатор затрат будет переписывать запросы для получения максимально быстрых результатов, с минимально возможным сетевым трафиком, на основе виртуальной схемы, построенной при соединении удаленных объектов.

Отказ от ответственности: я работаю на OpenLink Software, но не получаю прямой выгоды от использования наших продуктов.

.
0
ответ дан 10 December 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: