SQL compact: Un valor duplicado no se puede insertar en un índice único

Estoy haciendo un programa de registro de estudiantes y proyectos de servicio comunitario en c# con base de datos sql server ce 4.0. En mi bd tengo las tablas Proyecto y estudiantes, pero al realizar una consulta me arroja lo siguiente

A duplicate value cannot be inserted into a unique index. [ Table name = proyectos,Constraint name = PK_proyectos ]

He buscado por toda la web una solución pero no doy con ella.

1 Respuesta

Respuesta
1

Exactamente ¿Qué consulta quieres hacer? Si puedes pon tu consulta para analizarla mejor y ayudarte a corregirla.

Lo único que te puedo decir en estos momentos es que la advertencia que te saca en si te esta indicando que no puedes insertar una clave duplicada en un indice único, en cierto modo y supongo, ¿En tu consulta, también haces un INSERT? Si es así, hay dos posibilidades, estas utilizando un INSERT para almacenar un registro existente o lo otro, estas tratando de actualizar un registro con un determinado indice con un INSERT! Te recomiendo que utilices la clausula UPDATE para actualizar registros ya que esta no modifica la unique key, solo los datos correspondientes a esa clave.

Espero pronta respuesta, en cuanto a lo que expuse aquí, que te haya servido de algo y saludos!

En efecto estoy usando un INSERT para almacenar registros, lo que no entiendo es porque con esta tabla "proyectos" me arroja ese error ya que tengo otra tabla "estudiantes" y no pasa nada.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlServerCe;
namespace ControlServicioComunitario
{
    public class ProyectoDAL
    {
        public static int agregar(ProyectoClass Pproyecto)
        {
            int retorno = 0;
            using (SqlCeConnection conn = BDc.ObtnerCOnexion())
            {
                SqlCeCommand comando = new SqlCeCommand(string.Format("INSERT INTO proyectos(proyecto) VALUES  ('{0}')", Pproyecto.proyecto), conn);
                retorno = comando.ExecuteNonQuery();
                conn.Close();
            }
            return retorno;
        }
        public static List<ProyectoClass> BuscarProyecto(String Pproyecto)
        {
            List<ProyectoClass> lista = new List<ProyectoClass>();
            using (SqlCeConnection conexion = BDc.ObtnerCOnexion())
            {
                SqlCeCommand comando = new SqlCeCommand(string.Format("SELECT proyecto FROM proyectos where proyecto like '%{0}%'", Pproyecto), conexion);
                SqlCeDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    ProyectoClass pbproyecto = new ProyectoClass();
                    pbproyecto.proyecto = reader.GetString(0);
                    lista.Add(pbproyecto);
                }
                conexion.Close();
                return lista;
            }
        }
    }
}    

Primeramente lo que me expones aquí a mi parecer, esta correcto y no veo el error en si, te recomendaría hacer un debug (DEPURAR -> Iniciar Depuración -Si utilizas Visual Studio) para encontrar la línea que esta causando esto porque así a simple vista no te puedo ayudar ya que puede que los errores que te den se deban a otra clase y no a la clase que me muestras, como por ejemplo, "ProyectoClass" de tu función "agregar" y además, no se donde llamas dichas funciones en tu proyecto o que valor estas mandando como parámetro para cada función, puede que aún no tengas controlado algunos errores y debes de manejar dichos errores ya que puede que sucedan en algún momento! Espero pronta respuesta y saludos!

PD: Si no sabes hacer un debug, te recomendaría ver un vídeo tutorial de esto para que sepas como realizarlo! Aquí te dejo un link relacionado https://www.youtube.com/watch?v=NOWq6Lwdq1I . Cuando realices el debug y encuentres que línea esta causando esto y que es lo que te muestra, me mandas una captura de pantalla, esta bien?

El error me da en esta parte del código

Aca esta el codigo de "Proyectoclass"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ControlServicioComunitario
{
    public class ProyectoClass
    {
        public String codigo { get; set; }
        public String proyecto { get; set; }
        public ProyectoClass() { }
        public ProyectoClass(String pcodigo, String pproyecto)
        {
            this.codigo = pcodigo;
            this.proyecto = pproyecto;
        }
    }
}

Algo que note en tu clase "ProyectoClass", ¿La variable "codigo" es tu clave principal en la tabla "proyecto"? Si es así, te recomendaría quitarlo ya que estas intentando almacenar un código aparte de la clave principal; o poniéndolo de otra manera, ¿Tu tabla "proyecto" tienes dos campos? Imagino que tienes el campo "codigo" como clave principal y el campo "proyecto" como el nombre del proyecto; por consiguiente es un motivo por el cual te aparece dicho error en esa línea ya que intenta ingresar un código ajeno a la generación automática de la clave principal; por otro lado, si el campo "codigo" es un código generado desde la aplicación, te recomendaría agregar un nuevo campo para denotar esto, es decir, estaría el id (clave principal), el código y el proyecto como campos, si no es así lo que pretendías hacer, te sugiero que quites el atributo de clave principal del campo "codigo" en la tabla "proyecto" para que pueda almacenar el código generado desde tu aplicación!

Espero que puedas hacer lo que te especifique aquí y me envías el resultado!

Si tenia dos campos "código" y "proyecto", la clave principal estaba en la variable "proyecto", digo estaba porque modifique la tabla y ahora no me arroja el error de duplicado. Ahora el asunto es que ingreso los datos y todo el procedimiento se ejecuta sin error, pero al abrir la tabla no muestra los registros ingresados, igualmente al pedir que los muestre en la datagridview desde el form

En tu clase "ProyectoDAL", en la función "BuscarProyecto", la variable "lista" ¿En dónde lo llamas? Esto me refiero a que no le haces referencia para que muestre los datos; otra cosa es la posibilidad de que no este ingresando los datos a la tabla, para confirmarlo, deberías ingresar a la tabla en modo vista (No diseño) para ver si los registros fueron ingresados, sino posees datos en la tabla, seguramente el registro no ha sido ingresado correctamente.

Imagino que utilizas la función "BuscarProyecto" en un botón y este podría estar mandando datos que no son, es decir, digamos que no esta pasando el parámetro correcto y en la búsqueda no este encontrando nada, de lo cual, el problema esta en el parámetro de envío hacia la función, verifica esto mediante un debug (Haces referencia al parámetro de envío haber que esta mandando) y me haces saber!

Ya corregí los dos errores y eran algo mínimo. Todo era porque la misma textbox estaba ingresando datos en las dos tablas "proyectos" y "estudiantes" razón por la cual en el primer caso daba el error de duplicado y en el segundo caso, no guardaba los datos en la tabla correspondiente ya que esa textbox esta destinada inicialmente a guardar solo datos de estudiantes y no de proyectos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas