要在C#中从不同数据库读取的连接字符串

时间:2016-01-31 19:44:11

标签: c# sql oracle

假设我想检查两个不同系统/数据库之间的数据,如下所示:

select    CLIENT1.CLIENTNAME AS CLIENTNAME1,
          CLIENT2.CLIENTNAME AS CLIENTNAME2
from      [System1-Database]..CLIENT as CLIENT1
left join [System2-Database]..CLIENT as CLIENT2
on        CLIENT1.idclient=CLIENT2.idclient

问题是每个系统/数据库都有一个连接字符串(一个使用sql-server,另一个使用oracle)。

如何在c#中执行此选择命令?

2 个答案:

答案 0 :(得分:0)

您需要使用sp_addlinkedserver来创建服务器链接。有关用法,请参阅参考文档。建立服务器链接后,您将正常构建查询,只需在数据库名称前加上其他服务器。即:

-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
        ON tab1.ID = tab2.ID

建立链接后,您还可以使用OPENQUERY在远程服务器上执行SQL语句,并仅将数据传回给您。这可以更快一点,它将让远程服务器优化您的查询。如果您在上面的示例中将数据缓存在DB1上的临时(或内存)表中,那么您就可以像加入标准表一样查询它。例如:

-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')

-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID

查看OPENQUERY的文档以查看更多示例。上面的例子非常人为。我肯定会使用这个特定示例中的第一个方法,但如果您使用查询过滤掉一些数据,那么使用OPENQUERY的第二个选项可以节省一些时间和性能。

答案 1 :(得分:0)

为什么不对数据库进行两次不同的调用,一次调用sql db,另一次调用oracle,之后内连接数据表?

DataTable oracleTbl = GetOracleData();
DataTable sqlTbl = GetSqlData();

var results = from oracleTbl in dt1.AsEnumerable()
                 join sqlTbl in dt2.AsEnumerable() on (Guid)sqlTbl ["ID"] equals (int)oracleTbl["ID"]
                 select new
                 {
                     //Select data you need
                 };