1

2 つのテーブルがあり、1 つはローカル データベースにあり、もう 1 つはリモート サーバーにあります。C# でポート フォワーディングを使用して、ssh リモート接続を localhost:3306 に取得します。ローカル データベースは localhost:3307 にあります。

両方とも localhost 上にあり、ポートが異なる場合、あるテーブルを別のテーブルにコピーするにはどうすればよいですか。

これは私がやりたいクエリです:

cmd = new MySqlCommand(String.Format("INSERT INTO {0} (a,b,c,d) SELECT (a,b,c,d) FROM {1}", ConfigSettings.ReadSetting("main_table"), ConfigSettings.ReadSetting("main_table")), con);

両方のテーブルに同じ列があるため、構成設定からの入力を 1 つだけ使用しています。

しかし、それらは異なるポートにあるため、2 つの接続文字列があります。

con.ConnectionString = ConfigurationManager.ConnectionStrings["con1"].ConnectionString;
con2.ConnectionString = ConfigurationManager.ConnectionStrings["con2"].ConnectionString

MySqlでFEDERATED接続を使用したくないので、クエリをこれら2つのポートで動作させる方法はありますか? 両方とも同じサーバー上にあるため、方法があるに違いありません。

ありがとうございました

編集:

接続文字列:

<add name="Con2" connectionString="server=localhost;port=3307;user id=root;Password=*****;database=data" providerName="MySql.Data.MySqlClient"/>
<add name="Con1" connectionString="server=localhost;port=3306;user id=root;Password=******;database=data" providerName="MySql.Data.MySqlClient"/>
4

1 に答える 1

1

2 つの異なる接続上の 2 つの別々のテーブル間でデータを移動する疑似コード

  1. 最初のMySqlへの接続を作成/開く
  2. クエリを作成/実行して、最初の MySql から DataTable 内のデータを取得します
  3. 2 番目の MySql への接続を作成/開く
  4. クエリを作成/実行して、レコードなしで 2 番目の MySql から DataTable 内のデータを取得します (WHERE 1=0 などを使用)
  5. 最初の DataTable の行をループします
  6. 最初の行の値を渡して、2 番目のテーブルで ImportRow を呼び出します。
  7. 2 番目のデータテーブルを保存する

    DataTable dtSource = new DataTable();
    using(MySqlConnection cn1 = GetConnection("first_connection_string");
    {
        cn1.Open();
        MySqlCommand cmd = new MySqlCommand("Select x,x,x,x from t1", cn1);
        MySqlDataAdapter da = new MySqlDataAdapter();
        da.SelectCommand = cmd;
        da.Fill(dtSource);
    }
    
    DataTable dtDest = new DataTable();
    using(MySqlConnection cn2 = GetConnection("second_connection_string");
    {
        cn2.Open();
        MySqlCommand cmd = new MySqlCommand("Select x,x,x,x from t2 where 1=0", cn2);
        MySqlDataAdapter da2 = new MySqlDataAdapter();
        da2.SelectCommand = cmd;
        da2.Fill(dtDest);
    
        foreach(DataRow r in dtSource)
            dtDest.ImportRow(r);
    
        da2.Update(dtDest);
    }
    

これはテストされていないことに注意してください。実験的なものと考えてください。

編集:コメントを見て、2番目のテーブルを更新する別の方法を追加します

    using(MySqlConnection cn2 = GetConnection("second_connection_string");
    {
        cn2.Open();
        MySqlCommand cmd = new MySqlCommand("INSERT INTO T2 (a,b) values(@a,@b)", cn2);
        cmd.Parameters.AddWithValue("@a", string.Empty); // Suppose the "a" field is a string
        cmd.Parameters.AddWithValue("@b", string.Empty); // Suppose the "b" field is a string

        foreach(DataRow r in dtSource)
        {
            cmd.Parameters["@a"].Value = r["a"].ToString();
            cmd.Parameters["@b"].Value = r["b"].ToString();
            cmd.ExecuteNonQuery();
        }
    }

これは、宛先テーブルの dtSource からレコード全体を挿入する必要がない場合です。この場合、パラメーターを指定した INSERT コマンドに戻り、ソース テーブルでループし、宛先テーブルに挿入します。

于 2012-06-03T09:58:28.320 に答える