[SOLUCIONADO] DataAdapter.Update no guarda los cambios en la base de datos MySQL

Iniciado por calvo225, 13 Agosto 2009, 19:11 PM

0 Miembros y 1 Visitante están viendo este tema.

calvo225

Hola a todos, a ver si me podéis echar una mano que me estoy volviendo un poco loco buscando la respuesta.

Resulta que en una aplicación en C# 3.0 y Framework 3.5, accedo a una base de datos MySQL a través del conector MySQL Connetor. La conexión se realiza correctamente, he enlazado un campo de una tabla a un TextBox a través de DataBindings, pero al actualizar el DataAdapter, los cambios del DataSet no se reflejan en la base de datos. En el DataSet los datos sí han cambiado (lo miro en la ejecución paso a paso), pero no en la base de datos.

Sin embargo, si enlazo un DataGridView a la base de datos, y modifico algo en él, los cambios sí se realizan correctamente. No sé qué estoy haciendo mal, agradecería cualquier ayuda.

Os dejo el código (en realidad es más complejo, pero lo he simplificado en un ejemplo más sencillo).

El formulario sólo tiene un TextBox y un botón.

public partial class Form1 : Form
   {
       private DataSet ds;
       private MySql.Data.MySqlClient.MySqlConnection conn;
       private MySql.Data.MySqlClient.MySqlDataAdapter da;
       private MySql.Data.MySqlClient.MySqlCommandBuilder cb;
       private string connectionstring;
       

       public Form1()
       {

           InitializeComponent();

           // Conexión con la base de datos
           connectionstring="server=*;uid=*;pwd=*;database=*;";
           conn = new MySql.Data.MySqlClient.MySqlConnection();
           conn.ConnectionString = this.connectionstring;
           conn.Open();

           string SelectCommand = "SELECT ID, Campo1 FROM Tabla;";

           da = new MySql.Data.MySqlClient.MySqlDataAdapter(SelectCommand, conn);
           cb = new MySql.Data.MySqlClient.MySqlCommandBuilder(da);

           // Esto se supone que lo hace el CommandBuilder pero al depurar no genera los comandos en el DataAdapter
           da.InsertCommand = cb.GetInsertCommand();
           da.UpdateCommand = cb.GetUpdateCommand();
           da.DeleteCommand = cb.GetDeleteCommand();

           ds = new DataSet();
           da.Fill(ds, "Tabla");
           textBox1.DataBindings.Add(new Binding("Text", ds, "Tabla.Campo1"));
           
       }

       private void button1_Click(object sender, EventArgs e)
       {
           
           da.Update(ds, "Tabla");
           
       }



------------

La solución pasa por crear un BindingSource después del

    da.Fill(ds, "Tabla");

y en el botón llamar a

   bs.EndEdit();


Por tanto, haciendo lo siguiente, funciona:

// En la declaración de variables globales
private BindingSource bs;

// Dentro de Form_Load, después de da.Fill(ds, "Tabla");
bs = new BindingSource();
bs.DataSource = ds;
bs.DataMember = "Tabla";
textBox1.DataBindings.Add("Text", bs, "Campo1");  //OJO, se sustituye el DataSet por el BindingSource y se toma el campo directamente,
                                                                           //no hay que indicar la tabla ya que se seleccionó como DataMember en el BindingSource

// En el botón, antes de da.Update(ds, "Tabla");
bs.EndEdit();