Violation of PRIMARY KEY

Iniciado por stivcen, 26 Enero 2021, 23:27 PM

0 Miembros y 1 Visitante están viendo este tema.

stivcen

Tengo un error a la hora de agregar datos si inserto un numero en la parte de la tabla llamada código si es igual a uno anterior que ya había capturado me aparece un recuadro.

System.Data.SqlClient.SqlException: 'Violation of PRIMARY KEY constraint 'PK__MATERIAL__CC87E127D767918D'. Cannot insert duplicate key in object 'dbo.MATERIAL'. The duplicate key value is (0001).
Esta es la parte del código lo que quiero es que cuando ponga un numero repetido me arroje un recuadro que le diga al usuario que esta repetido e inserte otro diferente, espero y me puedan ayudar.

private void button1_Click(object sender, EventArgs e)
        {

            CONEXION.Conectar();

         
            string insertar = "INSERT INTO MATERIAL(CODIGO,NOMBRE,VALOR,VOLTAJE,CANTIDAD,UBICACION)VALUES(@CODIGO,@NOMBRE,@VALOR,@VOLTAJE,@CANTIDAD,@UBICACION)";
            SqlCommand cmd1 = new SqlCommand(insertar, CONEXION.Conectar());

            cmd1.Parameters.AddWithValue("@CODIGO", txtcodigo.Text);
            cmd1.Parameters.AddWithValue("@NOMBRE",txtnombre.Text);
            cmd1.Parameters.AddWithValue("@VALOR",txtvalor.Text);
            cmd1.Parameters.AddWithValue("@VOLTAJE",txtvoltaje.Text);
            cmd1.Parameters.AddWithValue("@CANTIDAD",txtcantidad.Text);
            cmd1.Parameters.AddWithValue("@UBICACION",txtubicacion.Text);         
            cmd1.ExecuteNonQuery();

            MessageBox.Show("Componente Agregado");
            dataGridView1.DataSource = llenar_grid();

        }

BlackZeroX

#1
Esto va en .NET pero yo cuando quiero hacer inserts en hilos recurro a bloqueos de registros por BDD.

Deberías usar un consecutivo o algo similar (que funcione en hilos), o bloquear el registro (solo en updates)... en fin lo que debes hacer es validar si existe el registro antes de hacer el insert por que en la BDD ya existe, revisa la restriccion 'PK__MATERIAL__CC87E127D767918D' en tu BDD y revisa que campos ya se han ingresado.

Algo de código que yo uso en ocasiones para mitigar esto (En Oracle):

por ejemplo en Updates

Código (sql) [Seleccionar]

DECLARE
  CURSOR c1 IS SELECT empno, job, sal FROM emp FOR UPDATE;
BEGIN
  OPEN c1;
  LOOP
     FETCH c1 INTO bla bla bla
     UPDATE emp
     SET sal = new_sal
     WHERE CURRENT OF c1;
  END LOOP;
  CLOSE c1;
END;


En cuanto a INSERTS

uso un insert con una subquery (Se requieren índices para que sea "rápida").

Código (sql) [Seleccionar]

INSERT INTO A
SELECT
   'valor 1' as campo1,
   'valor 2' as campo2,
   'valor 3' as campo3
FROM DUAL
WHERE NOT EXISTS (
   SELECT * FROM A
   WHERE A.campo1 = 'valor 1' AND A.campo2 = 'valor 2' AND A.campo2 = 'valor 2';
)


o con un MERGE (Emulando 1 tabla), (Se requieren índices para que sea "rápida").

Código (sql) [Seleccionar]

MERGE INTO A target
USING (
SELECT
'valor 1' as campo1,
'valor 2' as campo2,
'valor 3' as campo3
FROM DUAL
) src
ON target.campo1 = src.campo1, target.campo2 = src.campo2, target.campo3 = src.campo3
WHEN MATCHED THEN
UPDATE SET target.campo1 = 'valor 1', target.campo2 = 'valor 2', target.campo3 = 'valor 3'
WHEN NOT MATCHED THEN
INSERT (campo1, campo2, campo3)
VALUES ('valor 1', 'valor 2', 'valor 2');


Saludos.
The Dark Shadow is my passion.