在 localhost 上使用不同的端口号连接 mysql 表
Posted
技术标签:
【中文标题】在 localhost 上使用不同的端口号连接 mysql 表【英文标题】:Connecting mysql tables on localhost with different port numbers 【发布时间】:2012-06-07 19:17:55 【问题描述】:我有两张表,一张在本地数据库中,另一张在远程服务器上。 我在 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"/>
【问题讨论】:
删除了我的答案。我看到您只想使用一个连接来执行插入。我不知道这是否可能。如果我发现什么,就环顾四周。 我看起来可以通过 c# 完成这项工作,例如,我可以从其中读取 select 并将其保存在某处并在必要时将其插入到另一个表中。 如果您可以使用单独的连接,那么您可以在 DataTable 中读取所有需要的数据,然后从第二个连接创建一个空数据表,然后通过第二个表中的 LoadDataRow 复制数据,然后写入返回第二个数据表的新记录。 【参考方案1】:在两个不同连接上的两个单独表之间移动数据的伪代码
-
创建/打开到第一个 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);
请注意,这尚未经过测试。把它当作实验。
编辑:看到 cmets 我将添加另一种方法来更新第二个表
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 命令,在源表上循环,在目标表中插入
【讨论】:
这是一个很好的例子——在第二个查询中,我想将表 1 中的所有内容插入到表 2 中,为什么要选择 2 次? 在第一个查询中,我从 Data 中输入了 SELEECT *,第二个查询应该像 insert... 第一个查询加载数据,第二个选择仅用于为没有数据的数据表提供模式。然后使用 da2 中的 select 命令派生 INSERT 和 UPDATE 命令以针对 dtDest 中的数据执行 我已将相同的查询放入第一个和第二个。只有在第二个我没有声明 where 时,我正在调试,我无法通过这部分da.Fill(dtSource);
- 这让我陷入空异常。我需要以某种方式初始化它吗?
是的,放一个 dtDest = new DataTable();而不是 dtDest = null 在进入第二个 using 语句之前以上是关于在 localhost 上使用不同的端口号连接 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章
win云服务器端口号开启,tomcat启动项目localhost 拒绝了我们的连接请求。