No se pudieron habilitar las restricciones. Una o más filas contienen valores que violan restricciones no nulas, únicas o de clave externa

Hola. Tengo un problema. Quiero obtener información sobre un paquete de la base de datos y vincular el software a ese paquete.

mi db se ve así.

create table Package
(
    PackageID int identity,
    PackageName varchar(50) not null,
    PackageDiscription varchar(max) not null,
    primary key (PackageID)
)



create table Software
(
    SoftwareID varchar(50) not null,
    SoftwareName varchar(50) not null,
    DownloadPath varchar(100) not null,
    PackageID int,
    Primary key (SoftwareID),
    Foreign Key (PackageID) references Package on delete cascade on update cascade
)

lo que estoy tratando de hacer es esto:

protected void BtnPackageSelect_Click(object sender, EventArgs e)
{
    SoftwareTableAdapters.PackageTableAdapter p = new SoftwareTableAdapters.PackageTableAdapter();
    SoftwareTableAdapters.SoftwareTableAdapter s = new SoftwareTableAdapters.SoftwareTableAdapter();

    foreach(var item in p.GetSelectedPackage(DropDownList1.SelectedValue))
    {
        string PackageName = item.PackageName;
        int PackageID = item.PackageID;
        string PackageDiscription = item.PackageDiscription;

        Label1.Text = "Name: " + PackageName;
        Label1.Visible = true;
        Label2.Text = "ID: " + PackageID;
        Label2.Visible = true;
        Label3.Text = "Discription: " + PackageDiscription;
        Label3.Visible = true;
        ListBox2.Visible = true;

        foreach (var software in s.GetSelectedIndexSoftware(PackageID)) <----- this is there the error come.
        {
            ListBox2.Items.Add(software.SoftwareName);
        }
    }
}

el método GetSelectedIndexSoftware (packageID) tiene este aspecto:

SELECT SoftwareName
FROM Software
WHERE (PackageID = @PackageID)

todo lo que tengo en la base de datos ahora es:

insert into Package values('1', '1')
insert into Package values('2', '2')

insert into Software values('1', '1', '1', null)
insert into Software values('2', '2', '2', null)
insert into Software values('3', '3', '3', null)
insert into Software values('4', '4', '4', null)

donde todos los nulos del software se han actualizado con 1

Soy bastante nuevo en la codificación, así que estoy un poco perdido. Espero que alguien pueda ayudarme a encontrar el problema.

------ EDITAR 1 ----- Ahora he intentado alterar la creación de Software para no permitir nulos, y luego crear un paquete primero llamado no vinculado donde todo el software que aún no está vinculado a un paquete será vinculado a. Al crearlo, se crea con 1 en PackageID. No ayudó.

------ EDIT 2 ----- Ahora he intentado no tener una clave externa en la tabla de software. tampoco lo hizo

preguntado el 08 de enero de 11 a las 20:01

1 Respuestas

Creo que la razón por la que recibe un error es porque no asignó un valor al PackageID de la tabla Software. Por lo tanto, cuando hace un "... s.GetSelectedIndexSoftware (PackageID)" en el bucle for, obtiene un valor nulo. En sus declaraciones de inserción, no está asignando un valor a PackageID.

insert into Software values('1', '1', '1', null)

debiera ser

insert into Software values('1', '1', '1', n)

donde n es un valor de identificación de la columna PackageID en la tabla Package.

Si eso no funciona. Es posible que desee intentar hacer que la columna SoftwareID sea una columna de identidad entera en la tabla Software.

Respondido el 08 de enero de 11 a las 23:01

¿Por qué inserto con un null. Esto se debe a que cuando se crea un software, todavía no tengo un paquete. es primero cuando el usuario desea agregar un software a un paquete que collum está configurado. - MrKanin

Luego, debe cambiar el código para verificar si es nulo. Por ejemplo: var softwares = s.GetSelectedIndexSoftware (PackageID); if (softwares! = null) {foreach (var software en softwares) {...}} - Alex Méndez

Oye, acabo de probar tu solución. pero no funcionó. parece que el error aparece en s.GetSelecteIndexSoftware (PackageID); He probado la depuración, y cuando ese ID de paquete que uso como parámetro es válido. y sé que está en la base de datos - MrKanin

Error encontrado. fue porque la consulta GetSelectedInsexSoftware () solo obtenía el softwareName. eso no fue suficiente. así que cuando expandí la selección para obtener toda la información, funcionó. - MrKanin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.