在 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 拒绝了我们的连接请求。

用于连接 cPanel MySQL 数据库的端口号是多少?

TCP/IP协议的端口号

如何在 WAMP 中更改 apache 的端口号

vc ,socket,一个网络进程可以同时开启多个线程,而这每一个线程是否都可以拥有一个属于自已的端口号?

POSTGRESQL的连接的端口号是多少