• 締切済み

C#で異なる環境のテーブル名をSQL上で指定したい

お世話になります。 SQLSERVERとOracle上で共通して持っているIDを基にOracleのテーブルに保持している データをSQLSEVERで取得したいと思っています。 (1)SQLSERVERのテーブルA ID NAME ------------------ 111 NULL 222 NULL 333 NULL (2)OracleのテーブルB ID NAME ------------------ 111 情報1 222 情報2 333 情報3 444 情報4 (1)に存在しているIDでそのIDに紐づくNAMEを(2)より取得したいと思ってます。…(3) (3)SQLSERVERのテーブルC ※(1)とインスタンス・データベース名は同じ ID NAME ------------------ 111 情報1 222 情報2 333 情報3 上記の処理をC#で実現しようとした時に --------------------------------------------------------------------------------- // 接続文字列を生成する string stConnectionString = string.Empty; stConnectionString += "Data Source = local;"; stConnectionString += "Initial Catalog = master;"; stConnectionString += "Integrated Security = SSPI;"; stConnectionString += "MultipleActiveResultSets=true"; // SqlConnection の新しいインスタンスを生成する (接続文字列を指定) System.Data.SqlClient.SqlConnection cSqlConnection = ( new System.Data.SqlClient.SqlConnection(stConnectionString) ); // データベース接続を開く cSqlConnection.Open(); // cSqlConnection から SqlCommand のインスタンスを生成する System.Data.SqlClient.SqlCommand hCommand = cSqlConnection.CreateCommand(); System.Data.SqlClient.SqlCommand aCommand = cSqlConnection.CreateCommand(); // 実行する SQL コマンドを設定する hCommand.CommandText = "SELECT ID FROM テーブルA "; // 指定した SQL コマンドを実行して SqlDataReader を構築する System.Data.SqlClient.SqlDataReader hReader = hCommand.ExecuteReader(); // hCommand を破棄する (正しくは オブジェクトの破棄を保証する を参照) hCommand.Dispose(); while (hReader.Read()) { aCommand.CommandText = "insert into テーブルC select * from テーブルB where id = " + "'" + hReader["ID"].ToString() + "'"; int iResult = aCommand.ExecuteNonQuery(); MessageBox.Show(iResult + "行返しました"); } //aCommandを破棄する。 aCommand.Dispose(); //hReaderを閉じる hReader.Close(); cSqlConnection.Close(); cSqlConnection.Dispose(); --------------------------------------------------------------------------------- で実現したいと思っていますが、INSERT INTO ~SELECT文で指定しているテーブルBはOracle上にあるため、以下のようにOarcleへのコネクションを張る必要があると考えています。 //Oracleの接続情報(Oracle.DataAccess.dll・using Oracle.DataAccess.Client;を事前に追加) OracleConnection conn = new OracleConnection(); conn.ConnectionString = "User Id=scott;Password=tiger;Data Source=orcl;"; OracleCommand cmd = conn.CreateCommand(); conn.Open(); ~ ここで質問ですが、上記のOracleへのコネクションを張った場合、 C#内で指定しているテーブルBをどのように記述すれば(3)の処理結果を実現できるでしょうか? ご教授よろしくお願い致します。

みんなの回答

noname#259269
noname#259269
回答No.1

SQL Server で、Oracle へのリンクサーバを構築すれば、 OracleConnection とか使わなくてもよくなります。 http://msdn.microsoft.com/ja-jp/library/ms188279.aspx リンクサーバを使わないのであれば、テーブルAのデータを抽出して、メモリなりワークファイルなりワークテーブルなりに格納してから、Oracleからデータを抽出し、マージして BULK INSERT でもすればよいかと思いますが。

eiki0520
質問者

補足

お世話になります。 回答ありがとうございます。 リンクサーバというのがあるのですね。 リンクサーバを使用しない場合の抽出方法について テーブルA・Bのデータ抽出及びマージ方法についてはどう実装すればよいかも 回答いただけると助かります。

関連するQ&A