none
Mejores Practicas: Guardar en la base los cambios de un datagridview VB.NET 2012

    Pregunta

  • Buen día. Hace tiempo vengo trabajando con formularios, en los cuales, en ocasiones tengo mas de un datagridview, y el método que utilizo para actualizar los cambios en la base de datos creo que no es el adecuado.

    Supogamos que tengo un ABM de artículos y en él un datagridview con las medidas asociadas a ese artículo.

    Al datagrid lo lleno de la siguiente manera:

    for each medida as datarow in TablaMedidas

    dg_medidas.row.ad(medida.item("id"),medida.item("esp"),medida.item("ancho"),medida.item("largo"))

    next

    NOTA: TablaMedidas contiene las relaciones previamente asociadas a ese artículo

    Ahora bien, actualmente, si necesito actualizar las medidas de un artículo X, y agregar otra, lo que hago es eliminar todas las relaciones del artículo X y volver a cargarlas, una por cada fila del datagridview que modifique. De esta manera no tengo que controlar que fila elimine, que fila agregue y que celda edite.

    Hasta ahora no venia teniendo problemas, pero asocié una tercera tabla al ID de esa relación, y si la elimino, pierdo la relación con la ya mensionada tercera tabla

    Agradecería mucho que alguien me pueda dar un consejo de como proceder en estos casos.

    Desde ya gracias por su tiempo. Saludos.

    martes, 7 de marzo de 2017 11:21

Respuestas

  • CM16,

    Entonces evalúa la segunda propuesta que te he realizado, el de escribir una marca -en una columna oculta- según el evento efectuado, por ejemplo, sí insertas una fila escribes la marca 'I', si "eliminas" una fila escribes la marca 'D' y configuras la propiedad Visible -de la fila- a False, de la misma manera si actualizas los datos de una fila; el objetivo es impactar únicamente sobre las filas que tienen una marca y para ello puedes utilizar operaciones individuales de Insert, Update, Delete o puedes hacer uso de MERGE (Transact-SQL)

    Insertar, actualizar y eliminar datos mediante MERGE


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator miércoles, 8 de marzo de 2017 15:51
    • Marcado como respuesta CM16 miércoles, 8 de marzo de 2017 16:37
    martes, 7 de marzo de 2017 19:51

Todas las respuestas

  • CM16,

    El procedimiento de persistencia debería realizar las operaciones según demanda y no en barrido como lo vienes haciendo actualmente, para ello una solución es actuar just in time en que se produce el evento (agregar, quitar, modificar) o escribir una marca que permita la evaluación posterior del suceso.

    {...} pero asocié una tercera tabla al ID de esa relación, y si la elimino, pierdo la relación con la ya mensionada tercera tabla

    No entiendo, te recomiendo que nos pongas en contexto o de ser posible nos dibujes las tablas y sus relaciones y nos platiques con algo más de detalle.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 7 de marzo de 2017 15:08
  • Buenas tardes y gracias por tu respuesta. He probado anteriormente lo que me sugieres pero la verdad es que no me convence actualizar la base al momento de producirse un evento en un datagrid, ya que me gustaría que el usuario realice todas las modificaciones y posteriormente confirme con el botón Guardar.

    Se te ocurre alguna otra manera?

    Desde ya muchas gracias

    • Editado CM16 martes, 7 de marzo de 2017 19:20 agregado
    martes, 7 de marzo de 2017 19:18
  • CM16,

    Entonces evalúa la segunda propuesta que te he realizado, el de escribir una marca -en una columna oculta- según el evento efectuado, por ejemplo, sí insertas una fila escribes la marca 'I', si "eliminas" una fila escribes la marca 'D' y configuras la propiedad Visible -de la fila- a False, de la misma manera si actualizas los datos de una fila; el objetivo es impactar únicamente sobre las filas que tienen una marca y para ello puedes utilizar operaciones individuales de Insert, Update, Delete o puedes hacer uso de MERGE (Transact-SQL)

    Insertar, actualizar y eliminar datos mediante MERGE


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator miércoles, 8 de marzo de 2017 15:51
    • Marcado como respuesta CM16 miércoles, 8 de marzo de 2017 16:37
    martes, 7 de marzo de 2017 19:51
  • Creo que es la única opción que me queda, y las filas que elimino guardarlas en una tabla o un grid generado en tiempo de ejecución. Cuando apriete guardar que elimine las filas de ese grid y actué con el grid visible de acuerdo a la marca que tenga. Pense que habría una forma alternativa de hacerlo que desconocía..

    Muchas gracias por tu respuesta.

    miércoles, 8 de marzo de 2017 16:36
  • CM16,

    No, no necesitas copiar a otro contenedor las filas que vas eliminando.

    En mi aporte anterior te mencioné configurar la propiedad Visible -de la fila "eliminada"- a False, la idea es dar la ilusión de que la fila efectivamente ha sido eliminada pero no nos interesa quitarla de la colección de filas, la necesitamos -y es visible- cuando iteres la colección -de filas- al momento de realizar la persistencia. 

    Private Sub btnEliminarRow_Click(sender As Object, e As EventArgs) Handles btnEliminarRow.Click
    
    	Dim Fila As DataGridViewRow = DataGridView1.CurrentRow
    
    	If Fila IsNot Nothing Then '¿Existe una referencia válida?
    		'Escribir marca
    		Fila.Cells("Estado").Value = "D"
    
    		'Seleccionar fila anterior (validar que no se trate de la primera fila)
    		DataGridView1.CurrentCell = DataGridView1(0, Fila.Index - 1)
    		DataGridView1(0, Fila.Index - 1).Selected = True
    
    		'Ocultar la fila 
    		Fila.Visible = False
    	End If
    
    End Sub

    También puedes considerar la opción de actualizar los cambios desde origen de datos vinculado contra la base de datos, te dejo unos enlaces:

    Database Updates From DatagridView

    Auto Saving DataGridView Rows to a SQL Server Database


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 8 de marzo de 2017 18:43