none
No eliminar datos de tablas relacionadas de access RRS feed

  • Pregunta

  • Hola a todos

    Siguiendo el hilo anterior, estoy haciendo un trabajo en visual basic 2008 express con una base datos access.
    el codigo funciona pero el problema es que tengo datos relacionados con otras tablas que por lo menos debo avisar que existen datos en cascada.
    Tengo un combobox en donde tengo el dato principal que son materiales de construccion y algunos textbox en donde existen datos secundarios como precio, unidad, etc. ASimismo tengo un datagridview en donde están la totalidad de los datos.
    El codigo de eliminar registros es el siguiente
    Dim textoMaterial As String = cmbMat.Text
            If MessageBox.Show("Realmente desea eliminar " & textoMaterial & " de la base de datos?", "DataC - Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = DialogResult.Yes Then
                     With MiAdaptadorMat
                    .DeleteCommand = New System.Data.OleDb.OleDbCommand
                    .DeleteCommand.Connection = MiConexion
                    .DeleteCommand.CommandText = "DELETE FROM Precios Where COS_DESCR = @material"
                    .DeleteCommand.CommandType = System.Data.CommandType.Text
                    .DeleteCommand.Parameters.Add("@material", OleDbType.VarChar).Value = textoMaterial
                    .Update(CType(Me.MiEnlazadorMat.DataSource, DataTable))
                End With
                MiConexion.Open()
                Dim Resultado = MiAdaptadorMat.DeleteCommand.ExecuteNonQuery()
                MiConexion.Close()
                Me.GridMateriales.Rows.Remove(Me.GridMateriales.CurrentRow)
                MessageBox.Show("Se eliminó " & textoMaterial & " registro de la base de datos", "DataC - Aviso")
            End If

    Gracias a todos
    jueves, 27 de agosto de 2009 17:39

Respuestas

  • el codigo quedo así

    If MessageBox.Show("Realmente desea eliminar " & textoMaterial & " de la base de datos?", "DataC - Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = DialogResult.Yes Then
                Try
                    With MiAdaptadorMat
                        .DeleteCommand = New System.Data.OleDb.OleDbCommand
                        .DeleteCommand.Connection = MiConexion
                        .DeleteCommand.CommandText = "DELETE FROM Precios Where COS_DESCR = @material"
                        .DeleteCommand.CommandType = System.Data.CommandType.Text
                        .DeleteCommand.Parameters.Add("@material", OleDbType.VarChar).Value = textoMaterial
                        .Update(CType(Me.MiEnlazadorMat.DataSource, DataTable))
                    End With
                    MiConexion.Open()
                    Dim Resultado = MiAdaptadorMat.DeleteCommand.ExecuteNonQuery()
                    MiConexion.Close()
                    Me.GridMateriales.Rows.Remove(Me.GridMateriales.CurrentRow)
                    MessageBox.Show("Se eliminó " & textoMaterial & " de la base de datos", "DataC - Aviso")
                Catch ex As Exception
                    MessageBox.Show("Error al intentar eliminar datos en cascada" & vbCrLf & ex.Message, "DataC - Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End Try

            End If
    pero esto solo avisa que hay error. Y si quiero eliminar realmente este registro como hago?
    Espero tu opinion para cerrar este capitulo

    Gracias amigo

    Carlos
    • Marcado como respuesta carlosanpy viernes, 28 de agosto de 2009 13:40
    jueves, 27 de agosto de 2009 20:07

Todas las respuestas

  • Carlos:

    Para evitar ese tipo de eliminación, en el diseñador de BD de Access deberás definir las relaciones entre las tablas de tu Base de Datos, activando el atributo "Exigir integridad referencial". Una vez hecho esto, cuando intentes eliminar un registro con relacionado con otra tabla, al realizar la operación "Dim Resultado = MiAdaptadorMat.DeleteCommand.ExecuteNonQuery()", el manejador de BD te arrojará el siguiente error: "El registro no se puede eliminar o cambiar porque la tabla "X" incluye registros relacionados.

    Si el aporte te es de utilidad, márcalo como respuesta

    Saludos,
    jgardesa


    jueves, 27 de agosto de 2009 18:09
  • Hola gracias por responder.
    He mirado en la base datos access, con la base abierta accedí a Relaciones, luego en 'Modificar relaciones', al darle click en la tabla precios vi que estaba activado las casillas 'Exigir integridad referencial', tambien 'Actualizar en cascadalos datos relacionados' y tambien 'Eliminar en cascada lo registros relacionados'.
    Probe una vez mas y no arroja el error ese del que haces refernencia sino borra sin perdon el dato relacionado.
    Sin embargo eliminando directamente entrando en el programa Access alli si sale el mensaje de 'Atencion, esta por eliminar ....' pero en mi proyecto de visual basic 2008 express no.

    Gracias

    Saludos

    Carlos

    jueves, 27 de agosto de 2009 18:28
  • Carlos:

    Según veo, con la instrucción ".Update(CType(Me.MiEnlazadorMat.DataSource, DataTable))" probablemente eliminas los datos de la tabla dependiente... prueba a omitir esa instrucción (sólo como prueba)... comenta el resultado

    Saludos,
    jgardesa
    jueves, 27 de agosto de 2009 18:32
  • jgardesa,
    he probado como me lo habias requerido, omiti la linea update(ctype(me.miensalaz.....) y lamentablemente sigue borrando sin piedad los datos relacionados

    Saludos

    Carlos
    jueves, 27 de agosto de 2009 18:37
  • Carlos:

    En Access desactiva la opción "Eliminar en cascada los registros relacionados"

    Saludos,
    jgardesa
    jueves, 27 de agosto de 2009 18:47
  • el codigo quedo así

    If MessageBox.Show("Realmente desea eliminar " & textoMaterial & " de la base de datos?", "DataC - Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = DialogResult.Yes Then
                Try
                    With MiAdaptadorMat
                        .DeleteCommand = New System.Data.OleDb.OleDbCommand
                        .DeleteCommand.Connection = MiConexion
                        .DeleteCommand.CommandText = "DELETE FROM Precios Where COS_DESCR = @material"
                        .DeleteCommand.CommandType = System.Data.CommandType.Text
                        .DeleteCommand.Parameters.Add("@material", OleDbType.VarChar).Value = textoMaterial
                        .Update(CType(Me.MiEnlazadorMat.DataSource, DataTable))
                    End With
                    MiConexion.Open()
                    Dim Resultado = MiAdaptadorMat.DeleteCommand.ExecuteNonQuery()
                    MiConexion.Close()
                    Me.GridMateriales.Rows.Remove(Me.GridMateriales.CurrentRow)
                    MessageBox.Show("Se eliminó " & textoMaterial & " de la base de datos", "DataC - Aviso")
                Catch ex As Exception
                    MessageBox.Show("Error al intentar eliminar datos en cascada" & vbCrLf & ex.Message, "DataC - Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End Try

            End If
    pero esto solo avisa que hay error. Y si quiero eliminar realmente este registro como hago?
    Espero tu opinion para cerrar este capitulo

    Gracias amigo

    Carlos
    • Marcado como respuesta carlosanpy viernes, 28 de agosto de 2009 13:40
    jueves, 27 de agosto de 2009 20:07