2012-05-25 74 views
0

大家好! 我試圖同步兩個數據庫,一個本地和一個遠程。問題是我有兩個連接立即打開,不知道如何。如果兩個數據庫我本地擁有它們,如果我正確更新因爲它們使用相同的連接。我遇到的問題是本地電路板更新程序沒有看到它,因爲連接沒有打開,我該怎麼辦?這是我的代碼。 兩個數據庫具有相同的表結構,但用戶/通行證和不同的數據庫名稱。謝謝!我怎樣纔能有兩個連接同時打開,以同步兩個數據庫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); 
    }  
} 

}

回答

0

可悲的是我不太關注你的代碼,因爲我不知道函數名,但是你可以有兩個或更多的連接到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的測試

0

你可以寫DML語句(INSERT的,UPDATE的,刪除的)合併在同一臺服務器上的兩個表,然後執行它們。

如果要同步兩臺不同服務器上的表,則應從表中讀取數據,分析應用程序中的數據,然後生成同步腳本。我可以說這個任務似乎很困難。

+0

感謝您的回覆。但我需要知道你是否不能按我的要求去做。它可以做? – user1417732

+0

你到底要做什麼?同步模式或數據?看看這些[同步工具](http://www.devart.com/dbforge/mysql/studio/database-synchronization.html)。這些工具向服務器打開兩個連接,從它們讀取數據,比較和同步它們。所以,可以做這個任務。 – Devart

+0

關於同步 - 問題是你不能在兩個MySQL服務器上寫一個查詢(在MySQL中只有FEDERATED引擎允許)。所以,你應該打開兩個連接,在應用程序中累積數據,然後分析它並生成同步腳本。 – Devart

相關問題