• 締切済み

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

  • SQLで同じDBに対し2つのコネクションをもてる?

    SQLServer2005ExpressEditionとVB.NETで、ひとつのDBに対して、コネクションを2つ持つことは可能ですか?または、問題などおこりませんか? 以下のような感じでやってみたところ、両方ともに接続はできましたが、何か問題をはらんでいないかお気づきの方いらっしゃいましたらご教示いただけると助かります。 ' 接続文字列を生成する Dim stConnectionString As String = "接続情報" ' SqlConnection の新しいインスタンスを生成する (接続文字列を指定) Dim cSqlConnection As New System.Data.SqlClient.SqlConnection(stConnectionString)   Dim cSqlConnection1 As New System.Data.SqlClient.SqlConnection(stConnectionString) ' データベース接続を開く cSqlConnection.Open() cSqlConnection1.Open() ' 実処理   ・   ・   ・ ' データベース接続を閉じる cSqlConnection.Close() cSqlConnection.Dispose() cSqlConnection1.Close() cSqlConnection1.Dispose()

  • エラーを発生させたい(SQLサーバーへの接続)

    ネットのサンプルコードでSQLサーバーの接続テストをしましたが、 存在しないSQL文でもエラーになりません。(vb2005です) Sub sqlサーバーへ接続() ' 接続文字列を生成する Dim Cn As New System.Data.SqlClient.SqlConnection Dim SQL As System.Data.SqlClient.SqlCommand Dim stConnectionString As String = String.Empty stConnectionString &= "Data Source = ××××\SQLEXPRESS;" stConnectionString &= "Initial Catalog = ×××;" stConnectionString &= "Integrated Security = SSPI;" ' SqlConnection の新しいインスタンスを生成する (接続文字列を指定) Dim cSqlConnection As New System.Data.SqlClient.SqlConnection(stConnectionString) ' データベース接続を開く cSqlConnection.Open() SQL = Cn.CreateCommand SQL.CommandText = "SELECT テーブル1.あああフィールド1 FROM テーブル1" '間違ってても進んでしまう。 ' 接続に成功した旨を表示する MessageBox.Show("Microsoft SQL Server に接続されました") ' データベース接続を閉じる (正しくは オブジェクトの破棄を保証する を参照) cSqlConnection.Close() cSqlConnection.Dispose() End Sub 「あああフィールド1」なんて存在しないのに、先に進んでしまいます。 エラー処理の仕方を教えてください。 よろしくお願いします。

  • VS2010 SqlServer 接続

    VisualStudio2010を使用しています。 MFCアプリケーション(DLL)化をして作成中。 言語はVC++を使っています。 下記のような構文を作成するとSYSTEMの構文でエラーになってしまいます。 エラー内容 : "定義していない識別子です"とエラー表示   CString stConnectionString; stConnectionString += "Data Source = ServerName;"; stConnectionString += "Initial Catalog = Northwind;"; stConnectionString += "Integrated Security = SSPI;"; System.Data.SqlClient.SqlConnection cSqlConnection = ( new System.Data.SqlClient.SqlConnection(stConnectionString) ); cSqlConnection.Open();   - - - 処理 - - - cSqlConnection.Close(); cSqlConnection.Dispose(); systemの定義はどのようにすればよいのか、調べてる最中です。 VBでは上手く接続できるのに、VC++では上手く接続出来ないので、説明があるようなサイトなどありましたら教えて下さい。 よろしくお願いします。

  • C#でのSQLへのアクセスについて

    SQL Serverのテーブルをコンソール上に表示する為のコードを書いたのですが SqlConnection SqlCommand SqlDataReader に対してエラーが出しまい、修正方法が分からず、どなたか教えて頂けないでしょうか? 【ソースコード】 using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using Microsoft.Data.SqlClient; static void Main(string[] args) { string connectionString = "Data Source=○○;Initial Catalog=○○;User ID=○○;Password=○○;"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlCommand command = new SqlCommand("SELECT * FROM [○○]", connection)) using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["column1"]); Console.WriteLine(reader["column2"]); } } } }

  • SQL Serverへの接続で困っています

    お世話になります。大変困っているので助けてください。 VB 2008EXPRESS EditionとSQL Server EXPRESS Edition(共に無償)をネットからダウンロードしてインストールしました。 VBからSQL Serverに接続したく以下のようなコードを記述しました。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 接続文字列を生成する Dim stConnectionString As String = String.Empty ' stConnectionString &= "Data Source = ABSAN\SQLEXPRESS;" ' stConnectionString &= "Initial Catalog = ABSAN;" ' stConnectionString &= "Integrated Security = SSPI;" stConnectionString = "Server=ABSAN\SQLEXPRESS;Initial Catalog=ABSAN;Integrated Security = SSPI;" ' SqlConnection の新しいインスタンスを生成する (接続文字列を指定) Dim cSqlConnection As New System.Data.SqlClient.SqlConnection(stConnectionString) ' データベース接続を開く cSqlConnection.Open() ' 接続に成功した旨を表示する MessageBox.Show("Microsoft SQL Server に接続されました") ' データベース接続を閉じる (正しくは オブジェクトの破棄を保証する を参照) cSqlConnection.Close() cSqlConnection.Dispose() End Sub 結果として、「SqlEXceptionはハンドルされませんでした」旨のメッセージが帰ってきます。 但し、自分でもData SourceとInitial Catalogの設定のところがこれでいいのかと思っています。 何らかの形で正しい設定をしたいのですが、サーバのインストール時にこのような設定があったように記憶がありません。 また他にも原因があるようでしたら教えてください。 何分急いで下ります。よろしくお願いいたします。

  • ログインに失敗し、MicrosoftReportViewer で作成したレポートが表示できない。

    正しい接続文字列で接続しているはずなのですが、 レポートが表示されずに困っています。 皆様の知恵をお借りしたく思います。よろしくお願いします。 開発環境はVisualStudio2008、DBはSQLServer2005EXPRESSです。 目的と操作手順、ソース、エラー内容は以下になります。 MicrosoftReportViewerでレポートデザインReport1.rdlcと それを表示するためのForm2を作成しました。 Form2は、ユーザー名やパスワードを入力するForm1で 正しい接続文字列が作成され、接続に成功した時に表示されます。 Report1.rdlc作成時に、 データソース構成ウィザードのデータ接続の選択で 「接続文字列に重要情報を含めますか?」という質問には 「いいえ。重要情報を接続文字列に含めません。」を選択し、 Form1でユーザーが入力するようにします。 -------Form1 ログインフォーム------------------- private void button1_Click(object sender, EventArgs e) { // 接続文字列を生成する string stConnectionString = string.Empty;  stConnectionString += "Data Source = " + textBox1.Text + "\\" + textBox2.Text + ";";  stConnectionString += "Initial Catalog = " + textBox3.Text + ";";  stConnectionString += "UID = sa;";  stConnectionString += "PWD = " + textBox4.Text + ";";  // インスタンスを生成 System.Data.SqlClient.SqlConnection cSqlConnection = ( new System.Data.SqlClient.SqlConnectio(stConnectionString));  // データベース接続 cSqlConnection.Open();  // 接続文字列を渡す。  Form2 form = new Form2(); form.myEditData = stConnectionString; form.ShowDialog(); form.Dispose();  //接続を閉じる  cSqlConnection.Close(); cSqlConnection.Dispose(); } ---Form2 MicrosoftReportViewerで作成した、Report1.rdlcを表示 public partial class Form2 : Form public string myEditData; private void Form2_Load(object sender, EventArgs e) {   //Form1で接続確定している文字列を使用する。 string stConnectionString = myEditData;   // SqlConnection の新しいインスタンス生成する    System.Data.SqlClient.SqlConnection cSqlConnection = ( new System.Data.SqlClient.SqlConnectio(stConnectionString)); // データベース接続 cSqlConnection.Open(); (※1) // report1.rdlcをForm2に張り付けた際に自動生成されるコード // TODO: このコード行はデータを  '[DB名]DataSet.[テーブル名]' テーブルに読み込みます。   必要に応じて移動、または削除をしてください。 (※2) this.[テーブル名]TableAdapter.Fill    (this.[DB名]DataSet.T_USERLIST); this.reportViewer1.RefreshReport(); } 接続文字列が正しい&ログイン出来ているのは(※1)の行で SQL文を実行し、正常な応答があった事で確認しました。 実行すると(※2)の行でエラーが発生します。内容は、  SQL EXCEPTIONはハンドルされませんでした。  ユーザー 'sa' はログインできませんでした。 というものです。

  • エクセルからSQLの接続の仕方

    エクセルを使ってMSSQLに接続したいのですが、エラーがでて接続できません。 なぜでしょうか? [エラー内容] コンパイルエラー: ユーザー定義型は定義されれいません。 コードの下の部分で発生します。 Dim Cn As New System.Data.SqlClient.SqlConnection [コード] Private Sub CommandButton1_Click() Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim SQL As System.Data.SqlClient.SqlCommand Dim ServerName As String Dim UserID As String Dim Password As String Dim DatabaseName As String ServerName = "TEST-PC" 'サーバー名(またはIPアドレス) UserID = "sa" 'ユーザーID Password = "password" 'パスワード DatabaseName = "TEST_DB_20140801" 'データベース St = "Server=" & ServerName & ";" & "User ID=" & UserID & ";" & "Password=" & Password & ";" & "Initial Catalog=" & DatabaseName Cn.ConnectionString = St SQL = Cn.CreateCommand SQL.CommandText = "SELECT * FROM LOG_DATA_XLINE" Cn.Open MsgBox (SQL.ExecuteScalar) Cn.Close SQL.Dispose Cn.Dispose End Sub

  • SQLSERVERの接続方法を教えて下さい

    Visual Studio C# Windows CE環境でSQLSERVERに接続する方法を教えて頂きたいです。 System.Data.SqlClient.SqlConnection cSqlConnection = new System.Data.SqlClient.SqlConnection("接続文字列"); cSqlConnection.Open(); とすると実行時にエラーになります。

  • SQLServerで別インスタンスのデータベースのテーブルの結合はできますか?

    [インスタンスA] UserID=sa PassWord=****** DataBase=DB01 で接続されるテーブルDB01.Table1 と [インスタンスB] UserID=HogeUser PassWord=@@@@@@ DataBase=DB02 で接続されるテーブルDB02.Table2 の2つのテーブルを結合してプログラムから処理を行いたいのですが、 可能なのでしょうか。 SQLのイメージは select * from [インスタンスA].[db01].[dbo].[Table1] tbl1 join [インスタンスB].[db02].[dbo].[Table2] tbl2 on tbl1.id=tbl2.id という感じです(もちろん動作しませんが) インスタンスAとインスタンスBは同一マシンにあり、SQLServer2008SP1とします。 開発環境はVS2008SP1でSqlClient.SqlConnectionを使用して接続し、 SqlCommandにてSQLを作成し、実行するような形です。 どうかよろしくお願いいたします。

  • VB.netでSQLserverに接続したい

    VB2008express で SQLserver2000に接続しようとしています フォーム上で ボタンを2つ作成し button1の記述では接続できるのですが button2では接続できず タイムオーバーになります。 SqlConnectionの使い方など基本的な理解不足かと思いますが お気づきの点あればお願いします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DATACNN As String Dim DATAADO As ADODB.Connection DATACNN = "DRIVER={SQL SERVER};" & "SERVER=TESTSERVER;UID=sa;PWD=123;DATABASE=BD" DATAADO = New ADODB.Connection DATAADO.Open(DATACNN) MsgBox("接続1OK") End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim stConnectionString As String = String.Empty stConnectionString &= "Data Source =TESTSERVER;" stConnectionString &= "persist security info=True;" stConnectionString &= "Database=BD;" stConnectionString &= "user id=sa;" stConnectionString &= "password=123;"  Dim cSqlConnection As New System.Data.SqlClient.SqlConnection(stConnectionString) cSqlConnection.Open()  ’←タイムオーバーになります MsgBox("接続2OK") cSqlConnection.Close() cSqlConnection.Dispose() End Sub

専門家に質問してみよう