2

我不确定这在 ADO.NET 中是否可行,但我仍然希望由各位大师来运行。

我有以下 sql 查询:

select a.name, b.id 
from datasource1_table a, datasource2_table b
where a.id=b.id

1) datasource1_table - SQL Server“SQLServer1”连接

2) datasource2_table - SQL Server“SQLServer2”连接

所以我有两个服务器都登录的连接字符串。我想一次性执行上面的sql。

可能吗?

如果您需要更多信息或澄清,请告诉我。

提前非常感谢。

4

4 回答 4

4

不完全是。您只能将一个 SqlConnection 与一个 SqlCommand 相关联。您可以做的是在 SQLServer1 上创建一个指向 SQLServer2的链接服务器。然后你可以像这样引用它:

select a.name, b.id 
from datasource1_table a, myLinkedServer.myDb.dbo.datasource2_table b
where a.id=b.id

在旁注中,我会更改您当前的语法以使用实际连接。

如果链接服务器不是一个选项,您可能必须执行两个查询并处理结果。

于 2012-08-07T23:46:06.490 回答
1

鉴于您不能使用链接服务器,您可能希望调查DataRelation

在您的示例中,执行两个 SELECT:

DataSet domain = new DataSet();

DataTable dataFromA = null;
DataTable dataFromB = null;

using(SqlConnection conn1 = new SqlConnection("FirstConnectionString"))
{
  DataTable dataFromA = //result from SELECT id, name FROM TableA
}


using(SqlConnection conn2 = new SqlConnection("SecondConnectionString"))
{
  DataTable dataFromB = //result from SELECT id, name FROM TableB
}

domain.Tables.Add(dataFromA);
domain.Tables.Add(dataFromB);

我在这里解释了这个过程。

在内存中拥有两个数据表后,您可以在它们之间创建一个 DataRelation:

DataRelation idRelationship = new DataRelation("ABLink", dataFromA.Columns["Id"], dataFromB.Columns["Id"]);

然后,您可以随心所欲地绘制这种关系

foreach(DataRow aRow in dataFromA.Rows)
{
  //matching B Rows:
  DataRow[] bRows = aRow.GetChildRows(idRelationship);
}

它实际上是两个表之间的内存索引。

于 2012-08-08T00:01:51.447 回答
0

您可以使用 sp_linkedserver 将一台服务器作为链接服务器添加到另一台服务器。然后,使用普通的 ado.net 连接和查询:

SELECT * FROM OPENQUERY (LinkedServerName,'SELECT * FROM myDatabase.Customer')

不是吗?

于 2012-08-07T23:53:06.833 回答
0

我和你现在的情况一样。DBA 不允许我使用链接服务器。

因此,作为解决方案,我实现了 WCF 服务,该服务连接到两个不同的数据库服务器并将记录集放入内存。在来自两个数据库的数据进入内存后,我们就可以使用它了。

请注意,当我们将所有数据都抓取到内存中时,您必须考虑我们正在处理的数据量。为了最小化数据,我们只能检索所需的数据(即避免使用 select * from table)

于 2012-08-08T01:48:35.830 回答