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();
}
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
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").
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").
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.