【问题标题】:connection string to read from different databases in C#从 C# 中的不同数据库读取的连接字符串
【发布时间】:2016-01-31 19:44:10
【问题描述】:

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

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# 中执行此选择命令?

【问题讨论】:

    标签: c# sql oracle


    【解决方案1】:

    您需要使用 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 的第二种方法可以节省一些时间和性能。

    【讨论】:

    【解决方案2】:

    为什么不对数据库进行两次不同的调用,一次调用 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
                     };
    

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 2017-09-22
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多