我有 2 个表,一个位于本地数据库中,另一个位于远程服务器上。 我在 C# 中使用端口转发来获取到 localhost:3306 的 ssh 远程连接,我的本地数据库位于 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"/>
最佳答案
在两个不同连接上的两个单独表之间移动数据的伪代码
- 创建/打开与第一个 MySql 的连接
- 创建/运行查询以从第一个 MySql 获取 DataTable 内的数据
- 创建/打开与第二个 MySql 的连接
- 创建/运行查询以从第二个没有记录的 MySql 获取 DataTable 内的数据(使用 WHERE 1=0 或类似的方法)
- 循环第一个 DataTable 的行
- 在第二个表上调用 ImportRow,传递来自 第一行
保存第二个数据表
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 命令,在源表上循环,在目标表中插入
关于c# - 使用不同的端口号连接本地主机上的 mysql 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10869072/