多个连接字符串
本文关键字:字符串 连接 | 更新日期: 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 服务。来自两个数据库的数据在内存中后,我们可以使用它。
请注意,您必须考虑我们正在处理多少数据,因为我们将所有数据都抓取到内存中。为了最小化数据,我们只能检索所需的数据(即避免使用从表中选择 *)