我不确定这在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。
有可能吗?
如果您需要更多信息或说明,请与我们联系。
提前多多感谢。
答案 0 :(得分:4)
不完全是。您只能将一个SqlConnection与SqlCommand关联。你可以做的是在SQLServer1上创建一个指向SQLServer2的linked server。然后你可以像这样引用它:
select a.name, b.id
from datasource1_table a, myLinkedServer.myDb.dbo.datasource2_table b
where a.id=b.id
另外,我会更改您当前的语法以使用实际连接。
如果链接服务器不是一个选项,您可能必须执行两个查询并处理结果。
答案 1 :(得分: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"]);
然后,您可以随意展示此relationship:
foreach(DataRow aRow in dataFromA.Rows)
{
//matching B Rows:
DataRow[] bRows = aRow.GetChildRows(idRelationship);
}
它实际上是两个表之间的内存索引。
答案 2 :(得分:0)
您可以使用sp_linkedserver将一台服务器作为链接服务器添加到另一台服务器。然后,使用普通的ado.net连接并查询:
SELECT * FROM OPENQUERY (LinkedServerName,'SELECT * FROM myDatabase.Customer')
不是吗?
答案 3 :(得分:0)
我和你现在的情况一样。 DBA不允许我使用链接服务器。
因此,作为一种解决方案,我实现了连接到两个不同数据库服务器并将记录设置到内存中的WCF服务。在来自两个数据库的数据在内存中后,我们可以使用它。
请注意,当我们抓住内存时,您必须考虑我们正在处理的数据量。为了最小化数据,我们只能检索所需的数据(即避免使用select * from table)