1

我有两张表,一张在本地数据库中,另一张在远程服务器上。我在 C# 中使用端口转发来让我的 ssh 远程连接到 localhost:3306 我的本地数据库在 localhost:3307

如果它们都在本地主机上但具有不同的端口,我如何将一个表复制到另一个表。

这是我想做的查询:

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

两个表都有相同的列,这就是为什么我只使用配置设置中的一个输入。

但是我有 2 个连接字符串,因为它们位于不同的端口上。

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

有什么方法可以让我的查询与这两个端口一起工作,因为我不想在 MySql 中使用 FEDERATED 连接。必须有办法,因为它们都在同一台服务器上。

谢谢

编辑:

连接字符串:

<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

在两个不同连接上的两个单独表之间移动数据的伪代码

  1. 创建/打开到第一个 MySql 的连接
  2. 创建/运行查询以从第一个 MySql 获取 DataTable 中的数据
  3. 创建/打开到第二个 MySql 的连接
  4. 创建/运行查询以从没有记录的第二个 MySql 获取 DataTable 中的数据(使用 WHERE 1=0 或类似的东西)
  5. 循环第一个 DataTable 的行
  6. 在第二个表上调用 ImportRow,传递来自第一行的值
  7. 保存第二个数据表

    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);
    }
    

请注意,这尚未经过测试。把它当作实验。

编辑:看到评论我会添加另一种方式来更新第二个表

    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 回答