miércoles, 23 de marzo de 2011

Ejercicio. Guardar cambios de un DataGridView en la Base de Datos


Partiendo de este proyecto, similar al que ya usamos para agregar personas a una tabla pero usando un DataSet en lugar de un DataReader, trata de incluir un objeto BindingSource que permita guardar las modificaciones o eliminaciones que hagamos sobre el DataGridView. Para ello, añade a la interfaz un botón para guardar los cambios y ten en cuenta los pasos necesarios que se indican a continuación. Añade los que no están implementados para dotar a la aplicación de la nueva funcionalidad.

// necesitamos una cadena de conexión que variará según el tipo de base de datos a la que nos conectemos.

string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\miBaseDeDatos.mdb";

La cadena de conexión está formada por dos partes: un proveedor y un origen de datos. El proveedor es el motor de base de datos que estamos usando, en este caso un motor Jet de Microsoft. El origen de datos para una base de datos Access es simplemente la trayectoria del fichero .mdb

Ahora usaremos la cadena de conexión para conectarnos y conseguir los datos que queremos.

//crear la conexion
string conn = new OleDbConnection(connString);

//crear la consulta a la base de datos
string query = "SELECT * FROM MiTabla";

//crear un adaptador para ejecutar la consulta
OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, conn);

//crear un constructor de sentencias
OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);

//crear un DataTable que almacene el resultado de la consulta
DataSet dSet = new DataSet();

//rellenar el DataSet con la información que le pasa el adaptador
dAdapter.Fill(dSet);

*******

Ahora veremos como se sincroniza el DataSet con la información de la base de datos a traves del DataGridView:

//creamos el DataGridView
DataGridView dgView = new DataGridView();

//creamos un BindingSource para sincronizar la información del DataSet y la del DataGridView
BindingSource bSource = new BindingSource();

//el origen de datos del BindingSource es la única tabla de datos que contiene el DataSet,
// la primera de la colección Table
bSource.DataSource = dSet.Table[0];

//y el origen de datos del DataGridView es el BindingSource
dgView.DataSource = bSource;

*********


Finalmente, podemos habilitar un botón que al hacer clic sobre él actualice los cambios del DataGridView pasándolos al DataSet y finalmente a la base de datos. Para ello en el método que trate el evento de clic sólo hay que añadir:


dAdapter.Update(dSet);


*********

NOTA: la solución a este probrema sería prácticamente idéntica si en lugar de un DataSet, utilizamos un DataTable, con la única diferencia de que cuando se le asigna el origen de datos al DataBinding éste sería directamente el DataTable.

3 comentarios:

  1. una pregunta en
    string conn = new OleDbConnection(connString);

    lo correcto no seria:

    OleDbConnection conn = new OleDbConnection(connString);
    por que me marca error como tu lo indicas. (no se puede combertir OleDbConnection inplisitamente en string
    )

    ResponderEliminar
  2. tengo una consulta con linq, el cual en un var x, realizo la consulta a BD, y la almaceno en un obejto de lista, lo que quiero es pasar esa lista a un dataset. se puede hace y como seria?

    ResponderEliminar
  3. Esta seria mi consulta con LinQ
    var bus = from Base_Rms b in BD.Bases_RMS
    where b.OEM.Contains(cmbcliente.Text)
    orderby b.CARPETA ascending
    select b;
    lisbaserms = new List();
    lisbaserms = bus.ToList();

    ayuda porfa necesito pasarlo a dataset, ya que necesito probar como almacenar en sql server mas de 200000 registro lo mas rapido posible.

    ResponderEliminar