大家好! 我試圖同步兩個數據庫,一個本地和一個遠程。問題是我有兩個連接立即打開,不知道如何。如果兩個數據庫我本地擁有它們,如果我正確更新因爲它們使用相同的連接。我遇到的問題是本地電路板更新程序沒有看到它,因爲連接沒有打開,我該怎麼辦?這是我的代碼。 兩個數據庫具有相同的表結構,但用戶/通行證和不同的數據庫名稱。謝謝!我怎樣纔能有兩個連接同時打開,以同步兩個數據庫mysql在C#中?
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);
}
}
}
感謝您的回覆。但我需要知道你是否不能按我的要求去做。它可以做? – user1417732
你到底要做什麼?同步模式或數據?看看這些[同步工具](http://www.devart.com/dbforge/mysql/studio/database-synchronization.html)。這些工具向服務器打開兩個連接,從它們讀取數據,比較和同步它們。所以,可以做這個任務。 – Devart
關於同步 - 問題是你不能在兩個MySQL服務器上寫一個查詢(在MySQL中只有FEDERATED引擎允許)。所以,你應該打開兩個連接,在應用程序中累積數據,然後分析它並生成同步腳本。 – Devart