2012-08-07 133 views
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服務器 「了SQLServer1」 連接

2)datasource2_table - SQL服務器 「SQLServer2」 連接

所以我有聯繫字符串,它已經登錄了兩個服務器。我想一次執行上面的sql。

可能嗎?

讓我知道你是否需要更多的信息或澄清。

非常感謝。

+0

數據庫中的表是否位於同一個數據庫服務器上?還是他們在完全不同的服務器上?如果他們在不同的服務器上,例如,如果不分別從兩個數據庫中選擇數據,並通過DataTables加入內存,您會發現這非常困難。 – dash 2012-08-07 23:46:27

+0

服務器位於不同的位置,可以是任何dbtype - oracle,sql server或mysql – 2012-08-07 23:55:25

回答

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 

在旁註中我會改變你當前的語法來使用實際的連接。

如果鏈接服務器不是一個選項,您可能必須執行兩個查詢並處理結果。

+0

確實,儘管鏈接/遠程服務器維護起來可能會更復雜(但不會過分)。我曾在許多地方工作,DBA不會設置它們。 – dash 2012-08-07 23:50:52

+0

謝謝安倍。鏈接服務器不是一個選項。也可以從任何數據庫類型連接 - mysql,sql server或oracle。 – 2012-08-07 23:54:39

+0

沒有鏈接服務器我認爲你需要執行兩個單獨的查詢,然後處理結果。 – 2012-08-07 23:55:46

0

您可以使用sp_linkedserver將一臺服務器作爲鏈接服務器添加到另一臺服務器。然後,使用純ado.net連接和查詢:

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

不是嗎?

+1

或使用Nhibernate和兩個連接。請參閱文章http://mikehadlow.blogspot.com/2008/10/mapping-entities-to-multiple-databases.html進行試驗 – brainboost 2012-08-08 00:00:55

+0

聽起來不錯。但是我的進程可以連接到不同服務器中的多個數據源。 「NHibernate只要在同一臺服務器上就可以連接數據庫」 – 2012-08-08 00:09:37

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"]); 

然後,您可以explot這個relationship反正你想:

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

它是有效的在 - 兩個表之間的內存索引。

+0

破折號 - 謝謝你的示例。 – 2012-08-08 00:08:20

+0

@MuraliBala我已經做了完全一樣的事情,因爲我們不允許使用鏈接服務器。唯一需要注意的是,對於大型表,內存將成爲一個問題。在這種情況下,可以使用兩個DataReader,一個循環遍歷與第一個服務器的連接的表,一個循環遍歷與第二個服務器的連接。 – dash 2012-08-08 00:12:12

+0

非常感謝@dash – 2012-08-08 00:19:40

0

我和你現在的情況一樣。 DBA的不允許我使用鏈接服務器。

因此,作爲一個解決方案,我實現了WCF服務,該服務連接到兩個不同的數據庫服務器並獲取記錄集到內存中。將兩個數據庫中的數據存儲在內存中後,我們可以使用它。

請注意,您必須考慮我們處理的數據量,因爲我們正在抓取所有內存。爲了最小化數據,我們只能檢索所需的數據(即避免使用select * from表)