Borrar registros de dos tablas relacionadas
Tengo (en Visual Basic 2005) un formulario con un DataGridView (DgvAlumnos), un BindingNavigator (BdnAlumnos) y un botón (BtnActualizar) y dos tablas en una base de datos sql-server 2005, la primera se llama Alumno y la otra Matricular. Las dos tablas están relacionadas de 1 a N de forma que yo puedo tener en la tabla matricular varios Dni de alumnos, pero en la tabla Alumno solo puedo tener un Dni porque es la clave principal de la tabla. Cuando cargo el formulario lleno el datagridview (DgvAlumnos) con los datos de la tabla Alumno. Luego utilizo los botones del BindingNavigator para recorrer las filas del datagridview . El problema surge cuando yo selecciono una fila del datagridview y pulso el botón borrar del BindingNavigator para borrar la fila seleccionada. Cuando pulso en el botón BtnActualizar para actualizar la base de datos si el alumno que borro solo aparece en la tabla Alumno, me borra correctamente el registro en la base de datos, pero cuando el alumno esta en la tabla Alumno y también está en la tabla Matricular entonces me da el error siguiente :
Instrucción DELETE en conflicto con la restricción REFERENCE "FK_Matricular_Alumno". El conflicto ha aparecido en la base de datos "C:\USERS\ADMINISTRADOR\DESKTOP\WINDOWSAPPLICATION1\BDESCUELA.MDF", tabla "dbo.Matricular", column 'DniAlumno'. Se terminó la instrucción.
En principio no me debería de dar esa excepción por que yo antes de borrar un alumno de la tabla Alumno borro los registros de ese Alumno de la tabla Matricular (si es que los tiene ). El código es el siguiente:
Public Class Form1
Dim ConAlumnos As SqlConnection
Dim DAAlumnos As SqlDataAdapter
Dim DAMatricular As SqlDataAdapter
Dim BdsAlumnos As New BindingSource
Dim DSAlumnos1 As New DataSet("DSAlumnos")
Dim DSMatricular1 As New DataSet("DSMatricular")
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ConAlumnos = New SqlConnection
ConAlumnos.ConnectionString = "cadena de conexión"
DAAlumnos = New SqlDataAdapter("select * from Alumno", ConAlumnos)
DAAlumnos.Fill(DSAlumnos1, "Alumno")
BdsAlumnos.DataSource = DSAlumnos1
BdsAlumnos.DataMember = "Alumno"
DgvAlumnos.DataSource = BdsAlumnos
BdnAlumnos.BindingSource = BdsAlumnos
DAMatricular = New SqlDataAdapter("select * from Matricular", ConAlumnos)
DAMatricular.Fill(DSMatricular1, "Matricular")
End Sub
Private Sub BtnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnActualizar.Click
Dim Parametro1Delete As SqlParameter
DAMatricular.DeleteCommand = New SqlCommand("Delete from Matricular where DniAlumno = @DniAlumno", ConAlumnos)
Parametro1Delete = New SqlParameter("@DniAlumno", SqlDbType.NChar, 9)
Parametro1Delete.SourceColumn = DSMatricular1.Tables("Matricular").Columns("DniAlumno").ToString
Parametro1Delete.SourceVersion = DataRowVersion.Original
DAMatricular.DeleteCommand.Parameters.Add(Parametro1Delete)
Me.BindingContext(DSMatricular1, "Matricular").EndCurrentEdit()
If DSAlumnos1.HasChanges() Then
DAMatricular.Update(DSMatricular1, "Matricular")
DSMatricular1.Tables("Matricular").AcceptChanges()
End If
DAAlumnos.DeleteCommand = New SqlCommand("Delete from Alumno where Dni=@Dni", ConAlumnos)
Parametro1Delete = New SqlParameter("@Dni", SqlDbType.NChar, 9)
Parametro1Delete.SourceColumn = DSAlumnos1.Tables("Alumno").Columns("Dni").ToString
Parametro1Delete.SourceVersion = DataRowVersion.Original
DAAlumnos.DeleteCommand.Parameters.Add(Parametro1Delete)
Me.BindingContext(DSAlumnos1, "Alumno").EndCurrentEdit()
If DSAlumnos1.HasChanges() Then
DAAlumnos.Update(DSAlumnos1, "Alumno")
DSAlumnos1.Tables("Alumno").AcceptChanges()
End If
End Sub
End Class
El caso es que no me funciona lo de borrar primero en la tabla Matricular por eso me salta esa excepción. ¿Sabes dónde está el error?
Instrucción DELETE en conflicto con la restricción REFERENCE "FK_Matricular_Alumno". El conflicto ha aparecido en la base de datos "C:\USERS\ADMINISTRADOR\DESKTOP\WINDOWSAPPLICATION1\BDESCUELA.MDF", tabla "dbo.Matricular", column 'DniAlumno'. Se terminó la instrucción.
En principio no me debería de dar esa excepción por que yo antes de borrar un alumno de la tabla Alumno borro los registros de ese Alumno de la tabla Matricular (si es que los tiene ). El código es el siguiente:
Public Class Form1
Dim ConAlumnos As SqlConnection
Dim DAAlumnos As SqlDataAdapter
Dim DAMatricular As SqlDataAdapter
Dim BdsAlumnos As New BindingSource
Dim DSAlumnos1 As New DataSet("DSAlumnos")
Dim DSMatricular1 As New DataSet("DSMatricular")
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ConAlumnos = New SqlConnection
ConAlumnos.ConnectionString = "cadena de conexión"
DAAlumnos = New SqlDataAdapter("select * from Alumno", ConAlumnos)
DAAlumnos.Fill(DSAlumnos1, "Alumno")
BdsAlumnos.DataSource = DSAlumnos1
BdsAlumnos.DataMember = "Alumno"
DgvAlumnos.DataSource = BdsAlumnos
BdnAlumnos.BindingSource = BdsAlumnos
DAMatricular = New SqlDataAdapter("select * from Matricular", ConAlumnos)
DAMatricular.Fill(DSMatricular1, "Matricular")
End Sub
Private Sub BtnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnActualizar.Click
Dim Parametro1Delete As SqlParameter
DAMatricular.DeleteCommand = New SqlCommand("Delete from Matricular where DniAlumno = @DniAlumno", ConAlumnos)
Parametro1Delete = New SqlParameter("@DniAlumno", SqlDbType.NChar, 9)
Parametro1Delete.SourceColumn = DSMatricular1.Tables("Matricular").Columns("DniAlumno").ToString
Parametro1Delete.SourceVersion = DataRowVersion.Original
DAMatricular.DeleteCommand.Parameters.Add(Parametro1Delete)
Me.BindingContext(DSMatricular1, "Matricular").EndCurrentEdit()
If DSAlumnos1.HasChanges() Then
DAMatricular.Update(DSMatricular1, "Matricular")
DSMatricular1.Tables("Matricular").AcceptChanges()
End If
DAAlumnos.DeleteCommand = New SqlCommand("Delete from Alumno where Dni=@Dni", ConAlumnos)
Parametro1Delete = New SqlParameter("@Dni", SqlDbType.NChar, 9)
Parametro1Delete.SourceColumn = DSAlumnos1.Tables("Alumno").Columns("Dni").ToString
Parametro1Delete.SourceVersion = DataRowVersion.Original
DAAlumnos.DeleteCommand.Parameters.Add(Parametro1Delete)
Me.BindingContext(DSAlumnos1, "Alumno").EndCurrentEdit()
If DSAlumnos1.HasChanges() Then
DAAlumnos.Update(DSAlumnos1, "Alumno")
DSAlumnos1.Tables("Alumno").AcceptChanges()
End If
End Sub
End Class
El caso es que no me funciona lo de borrar primero en la tabla Matricular por eso me salta esa excepción. ¿Sabes dónde está el error?
2 Respuestas
Respuesta de mcominor
1
Respuesta de Luis Angel Octavio Alcaraz Barajas
1