多个连接字符串

本文关键字:字符串 连接 | 更新日期: 2024-10-30 18:32:03

我不确定这在 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。

可能吗?

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

提前非常感谢。

多个连接字符串

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

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

附带说明一下,我会更改您当前的语法以使用实际的连接。

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

鉴于您不能使用链接服务器,您可能希望调查 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 idRelationship = new DataRelation("ABLink", dataFromA.Columns["Id"], dataFromB.Columns["Id"]);

然后,您可以根据需要分配此关系:

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

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

您可以使用

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

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

不是吗?

我现在的情况

和你一样。DBA不允许我使用链接服务器。

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

请注意,您必须考虑我们正在处理多少数据,因为我们将所有数据都抓取到内存中。为了最小化数据,我们只能检索所需的数据(即避免使用从表中选择 *)