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 Server "SQLServer1" 接続

2) datasource2_table - SQL Server "SQLServer2" 接続

したがって、両方のサーバーにログインする接続文字列があります。上記のSQLを一発で実行したいと思います。

出来ますか?

さらに詳しい情報や説明が必要な場合はお知らせください。

よろしくお願いします。

4

4 に答える 4

1

Linked Server を使用できない場合は、DataRelationクラスを調査することをお勧めします。

あなたの例では、2 つの 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"]);

その後、この関係を必要に応じて探索できます。

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

これは事実上、2 つのテーブル間のインメモリ インデックスです。

于 2012-08-08T00:01:51.447 に答える
0

sp_linkedserver を使用して、1 つのサーバーを別のサーバーにリンク サーバーとして追加できます。次に、プレーンな ado.net 接続とクエリを使用します。

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

そうでしょう?

于 2012-08-07T23:53:06.833 に答える
0

私も今のあなたと同じ状況でした。DBA はリンク サーバーの使用を許可しませんでした。

そこで、解決策として、2 つの異なるデータベース サーバーに接続し、メモリにレコード セットを取得する WCF サービスを実装しました。2 つのデータベースからのデータがメモリに格納されたら、それを操作できます。

すべてをメモリに取り込むため、処理するデータの量を考慮する必要があることに注意してください。データを最小限に抑えるために、必要なデータのみを取得できます (つまり、select * from table の使用を避けます)。

于 2012-08-08T01:48:35.830 に答える