2009-12-30 30 views
5

Tengo una arquitectura de BD distributiva donde los datos se almacenan en varios servidores SQL.Query Varias bases de datos con una sola consulta de ado.net

cómo puedo hacer seleccionar/actualizar/eliminar ejecutando una sola consulta. por ejemplo, "select * from employees" debería devolver datos de todas las bases de datos que tengo.

Cómo escribir una consulta única que se ejecuta en varios servidores SQL y obtiene una sola vista consolidada en mi servidor web.

NOTA: Dado que el número de servidores SQL puede cambiar en diversas ocasiones por lo que estoy buscando otra cosa que las consultas relacionadas, pues la gestión de las consultas vinculadas a escala (arriba o abajo) es un gran dolor

+0

por transacción impliqué seleccionar/actualizar/eliminar ejecutando una sola consulta. por ejemplo, "select * from employees" debería devolver datos de las tres bases de datos. – user72486

Respuesta

3

Uso TransactionScope.

Si abre conexiones a diferentes servidores dentro del alcance, la transacción se reducirá a una transacción distribuida.

Ejemplo:

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() 
} 
+0

por cierto, es 'Complete()', not 'Commit()' –

+0

Gracias por la corrección. Fijo. – Oded

+0

por transacción impliqué seleccionar/actualizar/eliminar ejecutando una sola consulta. por ejemplo, "select * from employees" debería devolver datos de las tres bases de datos. – user72486

6

Para hablar con diferentes bases de datos/conexiones, necesitará una transacción distribuida a través de TransactionScope; Afortunadamente, esto es en realidad más fácil de db-transacciones (aunque es necesario una referencia a System.Transactions.dll):

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

Además, TransactionScope nido de forma natural, y se alista SqlConnection de forma automática, por lo que es muy fácil de usar .

+0

Vale la pena señalar que para usar transacciones distribuidas con TransactionScope, debe usar Windows 2000 o superior y tener el Controlador de transacciones distribuidas de Microsoft (MSDTC) servicio ejecutando –

+0

por transacción impliqué seleccionar/actualizar/eliminar ejecutando una sola consulta, por ejemplo, "seleccionar * de los empleados" debe devolver los datos de las tres bases de datos. – user72486

0

La mejor solución aquí es usar un DBMS virtual para combinar sus múltiples back-ends en un único backend aparente, de modo que su consulta va al DBMS virtual que luego la retransmite de manera apropiada a los almacenes de datos reales.

OpenLink Virtuoso es una opción. Virtuoso abre las conexiones a cualquier fuente de datos accesible para ODBC (incluido el acceso a JDBC, a través de un puente ODBC a JDBC).

Sus aplicaciones que consumen datos pueden conectarse a Virtuoso a través de ODBC, JDBC, OLE-DB o ADO.NET, según sea necesario. Todos los objetos vinculados remotos (Tablas, Vistas, Procedimientos almacenados, etc.) están disponibles a través de todos los mecanismos de acceso a datos.

Si bien puede lograr resultados similares utilizando las otras técnicas descritas aquí, estas requieren que el usuario final conozca todo sobre las estructuras de datos de back-end y optimice las consultas. Con Virtuoso, un optimizador basado en costos incorporado volverá a escribir las consultas para ofrecer los resultados más rápidos posibles, con el tráfico de red mínimo posible, basado en el esquema virtual construido cuando se vincula en los objetos remotos.

Espero que esto ayude!

Ted

ObDisclaimer: Trabajo para OpenLink Software, pero no se benefician directamente de personas que deciden utilizar nuestros productos.

+0

Debe revelar su afiliación al recomendar productos producidos por su empleador . –

0

No puede hacer lo que busca con una sola consulta a menos que esté dispuesto a insertar un intermediario de algún tipo, como una instancia de SQL Express, que mediaría con los otros servidores, quizás utilizando SQL CLR . Pero eso es desordenado.

Sería mucho más fácil simplemente emitir un montón de solicitudes asincrónicas, y luego fusionar las respuestas en una sola DataTable (o equivalente) cuando lleguen. Al utilizar llamadas asincrónicas de estilo ADO.NET nativas, todas las consultas pueden realizarse en paralelo. Por supuesto, necesitará usar un bloqueo mientras lee los datos en una sola DataTable.

Cuestiones relacionadas