Hoy voy a comentar un error que suele dar vb.net con la base de datos MySql en los formularios con Maestro-Detalle. El error lo da al eliminar algún registro de la tabla Maestro, grabar en la base de datos y después intentar dar de alta un nuevo registro en la misma tabla.
Vamos a intentar averiguar el porqué de este error.
Lo primero que vamos a ver es la estructura de las tablas afectadas en este error.
Tabla Detalle:
Relaciones de la tabla Detalle. Podemos observar que la relación es con la tabla "ReparacionesCab" con el campo "Id"
Tabla "ReparacionesCab". Campo "Id" Autoincremento
¿Por qué devuelve este error?
Básicamente es porque vb.net trabaja con los datos desconectados, es decir, cuando abres el formulario carga los datos de la base de datos en memoria, realiza todas las operaciones sobre la tabla en memoria y cuando le damos a grabar es cuando envía los datos a la base de datos, si la clave foránea está asignada a un valor auto numérico, cuando borramos un registro, en la base de datos se queda el hueco, este no lo volverá a utilizar MySql, pero en el DataSet de vb.net si que lo utilizará, con lo cual cuando grabamos el registro actualizará el campo auto numérico de la tabla generará el código que corresponda, dejando los huecos de los registros que borramos previamente, el detalle que tenía asignado un registro inicial, lo perderá y devolverá el error "Cannot add or update a child row: a foring key constraint fails".
¿Cómo solucionar este problema?
Aquí os dejo las sentencias SQL con sus respectivos comentarios.-- ELIMINAR LA CLAVE FORÁNEA "FK_REPARACIONESDET_REPARACIONESCAB
ALTER TABLE `hl_20120614`.`reparacionesdet` DROP FOREIGN KEY `fk_ReparacionesDet_ReparacionesCab1` ;
-- CREAR NUEVO CAMPO CONTROLADO DESDE EL PROGRAMA "IdCab"
ALTER TABLE `hl_20120614`.`reparacionescab` ADD COLUMN `IdCab` INT NOT NULL AFTER `Vehiculo`
, ADD UNIQUE INDEX `IdCab_UNIQUE` (`IdCab` ASC) ;
-- CREAR LA NUEVA RELACION DE LA TABLA DETALLE CON MAESTRO
ALTER TABLE `hl_20120614`.`reparacionesdet`
ADD CONSTRAINT `fk_ReparacionesDet_Cab`
FOREIGN KEY (`ReparacionesCab` )
REFERENCES `hl_20120614`.`reparacionescab` (`IdCab` )
ON DELETE NO ACTION
ON UPDATE NO ACTION
, ADD INDEX `fk_ReparacionesDet_Cab` (`ReparacionesCab` ASC) ;
Ahora sólo queda modificar el dataset en el programa vb.net, de forma que el campo "IdCab" será autonumérico, clave única, así será el programa vb.net el que controlará las actualizaciones del campo "IdCab". Quedará de la siguiente forma:
Un consejo: no useis campos autonuméricos para crear las relaciones, ya que más pronto o más tarde os dará error.
No hay comentarios:
Publicar un comentario