多个连接字符串

时间:2012-08-07 23:41:01

标签: c# sql sql-server ado.net sqlconnection

我不确定这在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 个答案:

答案 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)