如何一次打开两个连接来同步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中,只有联邦引擎允许)。因此,您应该打开两个连接,在应用程序中积累数据,然后分析数据并生成同步脚本。