2009-12-30 104 views
5

我有分布式数据库体系结构,其中数据存储在多个SQL服务器中。使用单个ado.net查询查询多个数据库

我该如何通过运行一个查询来选择/更新/删除。例如“select * from employees”应该返回我拥有的所有数据库中的数据。

如何编写跨多个SQL服务器运行的单个查询并获取单个统一视图到我的Web服务器。

注:由于SQL服务器的数量可以在不同的时间,所以我要寻找从1995年起大规模管理链接查询(向上或向下)链接查询别的东西改变是一个很大的痛苦

+0

按交易我暗示选择/更新/删除通过运行一个查询。例如“select * from employees”应该返回来自所有三个数据库的数据。 – user72486 2009-12-30 16:16:31

回答

3

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

btw,它是'完成()',而不是'Commit()' – 2009-12-30 13:21:45

+0

感谢您的更正。固定。 – Oded 2009-12-30 13:23:58

+0

按交易我暗示选择/更新/删除通过运行一个查询。例如“select * from employees”应该返回来自所有三个数据库的数据。 – user72486 2009-12-30 16:17:46

6

去跟不同的数据库/连接,您会通过TransactionScope需要一个分布式事务;幸运的是,这其实是比DB-交易容易(虽然你需要一个参考System.Transactions.dll):

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

此外,TransactionScope巢自然和SqlConnection自动登记,使得它很容易使用。

+0

值得注意的是,要在TransactionScope中使用分布式事务,您需要使用Windows 2000或更高版本并具有Microsoft分布式事务控制器( MSDTC)服务正在运行 – 2009-12-30 13:27:13

+0

通过事务处理我暗示通过运行一个查询来选择/更新/删除例如“select * from employees”应该返回来自所有三个数据库的数据 – user72486 2009-12-30 16:17:04

0

这里最好的解决方案是使用虚拟DBMS将多个后端融合到一个明显的后端 - 因此,您的查询将转到虚拟DBMS,然后将其适当地转发给实际的数据存储。

OpenLink Virtuoso是一种选择。 Virtuoso打开到任何ODBC可访问(包括JDBC访问,通过ODBC到JDBC桥)数据源的连接。

根据需要,您的数据使用应用程序可以通过ODBC,JDBC,OLE-DB或ADO.NET连接到Virtuoso。所有的远程链接对象(表,视图,存储过程等)都可以通过所有数据访问机制获得。

尽管您可以使用此处概述的其他技术获得类似结果,但这些要求最终用户了解所有关于后端数据结构的信息,并自行优化查询。使用Virtuoso时,内置的基于成本的优化器将重新编写查询,以基于虚拟架构在远程对象中链接时构建的虚拟架构,以最少的可能网络流量提供尽可能最快的结果。

我希望这有助于!

特德

ObDisclaimer:我为OpenLink的软件工作,但不直接从任何人选择使用我们的产品中受益。

+0

您应该在推荐您的雇主生产的产品时披露您的联系。 – 2014-07-03 19:04:34

0

除非您愿意插入某种类型的中介(如SQL Express实例),并且可能会与其他服务器进行调解,您可能无法使用SQL CLR 。但这很麻烦。

简单地发出一堆异步请求,然后在他们到达时将响应合并到单个DataTable(或等效)中会容易得多。通过使用本机ADO.NET样式的异步调用,所有查询都可以并行进行。在将数据读入单个DataTable时,您当然需要使用锁。