如何一次打开两个连接来同步c#中的两个数据库mysql?

如何一次打开两个连接来同步c#中的两个数据库mysql?,c#,mysql,database,synchronization,C#,Mysql,Database,Synchronization,大家好! 我正在尝试同步两个数据库,一个本地数据库和一个远程数据库。问题是,我有两个连接同时打开,不知道如何打开。如果这两个数据库使用相同的连接,我将在本地对它们进行正确更新。我的问题是,本地板更新程序没有看到它,因为连接没有打开,我怎么办?这是我的密码。 两个数据库具有相同的表结构,但用户/过程和不同的数据库名称。谢谢大家! using System; using System.Collections.Generic; using System.ComponentModel; using Sy

大家好! 我正在尝试同步两个数据库,一个本地数据库和一个远程数据库。问题是,我有两个连接同时打开,不知道如何打开。如果这两个数据库使用相同的连接,我将在本地对它们进行正确更新。我的问题是,本地板更新程序没有看到它,因为连接没有打开,我怎么办?这是我的密码。 两个数据库具有相同的表结构,但用户/过程和不同的数据库名称。谢谢大家!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace sincronizacion
{
public partial class Form1 : Form
{
    private string stringConexionLocal ="server=localhost;database=kiosco_m;UID=root;pwd=toor";
    private string stringConexionRemota = "server="ipserverremote";database=grupoorb_kioscom;UID=user_remote;pwd=pass_remote";

    //Instanciado de objetos conexión local
    MySqlConnection conexionLocal;
    MySqlDataAdapter dataAdapterLocal;
    DataSet dataSetLocal;
    MySqlCommandBuilder builderLocal;

    //Instanciado de objetos conexión remota
    MySqlConnection conexionRemota;
    MySqlDataAdapter dataAdapterRemota;
    DataSet dataSetRemoto;
    MySqlCommandBuilder builderRemoto;

    public Form1()
    {
        InitializeComponent();
    }

    private void CargarDatosLocal()
    {
        string Consulta = "SELECT * FROM empresas";
        try
        {
            conexionLocal = new MySqlConnection(this.stringConexionLocal);
            dataAdapterLocal = new MySqlDataAdapter(Consulta, conexionLocal);
            dataSetLocal = new DataSet();
            dataAdapterLocal.Fill(dataSetLocal, "empresas");
            builderLocal = new MySqlCommandBuilder(dataAdapterLocal);
            dataGridView1.DataSource = dataSetLocal;
            dataGridView1.DataMember = "empresas";
        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message, "Error al intentar conectarse a la BBDD local.", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }

    private void CargarDatosRemoto()
    {
        string Consulta = "SELECT * FROM empresas";
        try
        {
            conexionRemota = new MySqlConnection(this.stringConexionRemota);
            dataAdapterRemota = new MySqlDataAdapter(Consulta, conexionRemota);
            dataSetRemoto = new DataSet();
            dataAdapterRemota.Fill(dataSetRemoto, "empresas");
            builderRemoto = new MySqlCommandBuilder(dataAdapterRemota);
            dataGridView2.DataSource = dataSetRemoto;
            dataGridView2.DataMember = "empresas";

        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message, "Error al intentar conectarse a la BBDD Remota.", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }

    private void Sincronizar(string miConexionRemota)
    {
        MySqlConnection miConexion = new MySqlConnection(miConexionRemota);
        miConexion.Open();
        MySqlCommand comando = new MySqlCommand();
        MySqlTransaction transaccion;

        // Empieza la transacción
        transaccion = miConexion.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
        comando.Transaction = transaccion;
        comando.Connection = miConexion;

        try
        {
            comando.CommandText = "UPDATE kiosco_remoto.empresas INNER JOIN kiosco_m.empresas ON kiosco_remoto.empresas.Id = kiosco_m.empresas.Id SET kiosco_remoto.empresas.direccion = kiosco_m.empresas.direccion";
            comando.ExecuteNonQuery();
            transaccion.Commit();
            MessageBox.Show("Se han sincronizado las BBDD correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        catch (MySqlException ex)
        {
            transaccion.Rollback();
            MessageBox.Show(ex.Message, "Error al intentar sincronizar.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            //throw ex;

        }
        finally
        {
            CargarDatosLocal();
            CargarDatosRemoto();
            miConexion.Close();
        }

    }

    /* * *
     * 
     * Eventos
     *
     * * */

    private void botonLocal_Click(object sender, EventArgs e)
    {
        CargarDatosLocal();
    }

    private void botonCargaDatosRemoto_Click(object sender, EventArgs e)
    {
        CargarDatosRemoto();
    }

    private void botonGrabarBDLocal_Click(object sender, EventArgs e)
    {
        try
        {
            builderLocal.GetUpdateCommand();
            dataAdapterLocal.Update(dataSetLocal, "empresas");
            CargarDatosLocal();
        }
        catch (NullReferenceException ex)
        {
            MessageBox.Show(ex.Message, "No hay ninguna BBDD abierta.", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void botonGrabarBDRemota_Click(object sender, EventArgs e)
    {
        try
        {
            builderRemoto.GetUpdateCommand();
            dataAdapterRemota.Update(dataSetRemoto, "empresas");
            CargarDatosRemoto();
        }
        catch (NullReferenceException ex)
        {
            MessageBox.Show(ex.Message, "No hay ninguna BBDD abierta.", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        try
        {
            conexionLocal.Close();
            conexionRemota.Close();

            if ((conexionLocal != null) || (conexionRemota != null))
            {
                MessageBox.Show("Se han cerrado todas las conexiones abiertas.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        catch
        {
            // No hago nada.
        }
    }

    private void botonSincro_Click(object sender, EventArgs e)
    {
        Sincronizar(stringConexionRemota);
    }      
}

}

您可以编写DML语句(INSERT、UPDATE、DELETE)来合并同一服务器上的两个表,然后执行它们


如果要在两个不同的服务器上同步表,那么应该从表中读取数据,在应用程序中分析数据,然后生成同步脚本。我可以说这项任务似乎很困难。

您可以编写DML语句(INSERT、UPDATE、DELETE)来合并同一服务器上的两个表,然后执行它们


如果要在两个不同的服务器上同步表,那么应该从表中读取数据,在应用程序中分析数据,然后生成同步脚本。我可以说,这项任务似乎很困难。

遗憾的是,我不太了解您的代码,因为我不知道函数名,但是您可以打开两个或更多到MySQL的连接

同步数据是一个棘手的问题,如果您想进行单向同步,那么这并不困难,但是如果您想进行双向同步,那么当存在重复数据时,您必须处理大量异常

如果您希望将数据从本地数据库获取到远程数据库,则类似的操作将起作用:

string const query = "SELECT * FROM LocalTableName";
using (DbCommand sql =_MySQLConnection.CreateCommand()){
    sql.CommandText = query;
    using (DbDataReader row = sql.ExecuteReader()){
        // the data is sstored in row now upload to remote
        using (DbCommand sql_remote = _MySQLRemote.CreateCommand()){
            sql_remote.CommandText = "INSERT INTO RemoteTableName SET field1 = @p_field1";
            sql.Parameters.Add("@p_field1", row["field1"].toString());
            sql.ExecuteNonQuery();
            sql.Parameters.Clear();
        }
    }
}

很抱歉,它未经测试,可能有编码错误,因为我不在VS测试的前面

很遗憾,我不太了解您的代码,因为我不知道函数名,但是是的,您可以打开两个或更多到MySQL的连接

同步数据是一个棘手的问题,如果您想进行单向同步,那么这并不困难,但是如果您想进行双向同步,那么当存在重复数据时,您必须处理大量异常

如果您希望将数据从本地数据库获取到远程数据库,则类似的操作将起作用:

string const query = "SELECT * FROM LocalTableName";
using (DbCommand sql =_MySQLConnection.CreateCommand()){
    sql.CommandText = query;
    using (DbDataReader row = sql.ExecuteReader()){
        // the data is sstored in row now upload to remote
        using (DbCommand sql_remote = _MySQLRemote.CreateCommand()){
            sql_remote.CommandText = "INSERT INTO RemoteTableName SET field1 = @p_field1";
            sql.Parameters.Add("@p_field1", row["field1"].toString());
            sql.ExecuteNonQuery();
            sql.Parameters.Clear();
        }
    }
}

抱歉,它未经测试,可能有编码错误,因为我不在VS测试的前面

谢谢您的回复。但我需要知道你是否不能按我的要求去做。它能做什么?你到底要做什么?同步模式还是数据?看看这些。这些工具打开两个到服务器的连接,从中读取数据,比较并同步它们。所以,有可能完成这个任务。关于同步问题,您不能跨两个MySQL服务器编写一个查询(在MySQL中,只有联邦引擎允许)。因此,您应该打开两个连接,在应用程序中积累数据,然后分析数据并生成同步脚本。感谢您的回复。但我需要知道你是否不能按我的要求去做。它能做什么?你到底要做什么?同步模式还是数据?看看这些。这些工具打开两个到服务器的连接,从中读取数据,比较并同步它们。所以,有可能完成这个任务。关于同步问题,您不能跨两个MySQL服务器编写一个查询(在MySQL中,只有联邦引擎允许)。因此,您应该打开两个连接,在应用程序中积累数据,然后分析数据并生成同步脚本。