La cedula ingresada ya existe en la base de datos

Estoy desarrollando una aplicación en visual basic.net conectado a una base de datos en access, pero cuando trato de ingresar un valor a la base de datos, me dice que ya exite, en este caso es la cedula.
Aquí les voy a enviar el código que tengo, cualquier ayuda sera bien agradecida:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'aqui controlo los checkbox, pero utilizo valores string para enviarlo a la base de datos
        Dim check1, check2, check3, check4, check5 As String
        If CheckBox1.Checked = True Then
            check1 = "Sí"
        End If
        If CheckBox2.Checked = True Then
            check2 = "Sí"
        End If
        If CheckBox3.Checked = True Then
            check3 = "Sí"
        End If
        If CheckBox4.Checked = True Then
            check4 = "Sí"
        End If
        If CheckBox5.Checked = True Then
            check5 = "Sí"
        End If
        Try
            ob.cmd.Connection = conecto
            ob.cmd.CommandText = "insert into ASISTENCIA(Cedula,Lunes,Martes,Miercoles,Jueves,Viernes)values('" & TextBox1.Text & "','" & check1 & "','" & check2 & "','" & check3 & "','" & check4 & "','" & check5 & "')"
            ob.cmd.ExecuteNonQuery() 'Actualiza la tabla
            MsgBox("Guardado con éxito")
            reg.Close() 'cierra la tabla
            TextBox1.Text = ""
            ' los checkbox no limpian con asi sino como swe los pongo
            'CheckBox1.Text = ""
            'CheckBox2.Text = ""
            'CheckBox3.Text = ""
            'CheckBox4.Text = ""
            'CheckBox5.Text = ""
            CheckBox1.Checked = False
            CheckBox2.Checked = False
            CheckBox3.Checked = False
            CheckBox4.Checked = False
            CheckBox5.Checked = False
        Catch ex As Exception
            'reg.Close() 'cierra la tabla
            ' MsgBox(ex.Message)
            MsgBox("La cedula ingresada ya existe en la base de datos")
        End Try
    End Sub
Respuesta
1
Revisa la tabla donde quieres registrar los datos.
Seguramente la tabla tenga como campo clave el campo cedula. Y ese campo no se pueda repetir.
Por lo que me imagino que ya tienes datos en la tabla.
En esta función no se ve el valor que toma textbox1 por lo que supongo que ya tienes datos en la tabla y estas intentando grabar el mismo.
Para comprobarlo vacía la tabla y ejecuta la aplicación la primera vez grabará datos y la segunda no.
El error de el dato ya existe lo devuelde SQL o el gestor de base de datos que estás usando, no tu aplicación, por lo que es la base de datos la que no permite la grabación de ese registro y solo puede ser porque ese registro está duplicado.
Asimismo también puede ser porque exista un indice en la base de datos que se está repitiendo en esa inserción. El indice sería varios campos dentro de la tabla cuya combinación no se pueda repetir, por ejemplo Nombre y nombre de usuario en una tabla de usuarios, el nombre se podrá repetir pero nombre+nombre de usuario no se podrá repetir nunca
Yo cambiaría la tabla para añadir un campo más llamado ROW_ID o NUM o como quieras.
Este campo debe ser autonumérico y debe ser el campo clave de la tabla.
Este campo lo utilizará el gestor de base de datos para ordenar la información.
Aunque para tu aplicación no tenga ningún valor, en realidad va a permitir búsquedas de información más rápidas y evitará cualquier tipo de error por clave duplicada
espero que te sirva
cualquier cosa reabre la pregunta
Gracias hermano por tu ayuda. Bueno ya ice todo como me dijiste, pero ahora me sale el siguiente mensaje en visual basic:
No coinciden los tipos de datos en la expresión de criterios. Luego me sale el mensaje de que la cedula ya existe en la base de datos, y no es así.
Agradezco tu ayuda.
[email protected]
¿Puedes decimer el valor de textbox que estas pasando y los datos que tienes en la tabla? ¿O cuántos datos tienes en esa tabla?
¿Has vaciado la tabla para probar si graba registros?
¿En qué linea te da el error de No coinciden los tipos de datos en la expresión de criterio
y en que linea te da el otro error?
Hola hermano. La tabla que tengo esta vacía y cuando le doy grabar desde mi aplicación no guarda.
Si deseas te puedo enviar mi proyecto para que le des una chequeada, porqu ya no se que hacer y tengo que entregarlo a finales de ese mes.
Si me ayudas en esa brother.
Mándamelo y le echo un vistazo pero no te prometo nada
[email protected]
la filosofía de esta web es que tu aprendas a resolver el problema.
Yo no controlo mucho de .net, aunque esto que tienes parece sencillo, Conozco SQL y las bases de datos y ese error es el típico error de clave duplicada pero por lo que dices no parece.
Mándamelo con la base de datos le echo un vistazo y te digo lo que pueda
saludos
El problema que tienes es el siguiente
Los campos lunes... viernes de la base de datos están declarados como Si/No y lo que le pasas a la base de datos es campo TEXTO por lo que da error de tipos.
El mensaje de "el dato ya existe" es porque tienes un msgbox que, da igual el error que ocurra, siempre mostrará ese mensaje.
Tienes dos formas de arreglarlo:
1.- Le pasas valores SI/NO que es lo que espera la base de datos
2.- Le pasas los textos que tienes y cambias la base de datos para que reciba texto
el problema es que access muestra SI y parece que es un texto cuando en realidad almacena un "true" o un "1".
Detalle de las soluciones:
1.- Tienes que pasarle true o false (o también funciona con 1 o 0) a la base de datos no el valor "Si".
If CheckBox1.Checked = True Then
<span style="white-space: pre;"> </span>check1=true
else
<span style="white-space: pre;"> </span>check1=false
end if
2.- Simplemente cambia la definición de los campos y pone que son de tipo texto a todos los campos de esa tabla según lo tienes ya funcionaria.
aún así yo le pondría como valor Si o NO
If CheckBox1.Checked = True Then
<span style="white-space: pre;"> </span>check1="SI"
else
<span style="white-space: pre;"> </span>check1= "NO"
end if
Por otro lado existe otra solución que es la mejor.
Pasas de todos los controles que tienes y para el insert utilizas los propios valores del cehck box, con checkbox1. Cheked.
la propiedad checked es un true o false que es lo que epsera el campo SI/SO de access
así
ob.cmd.CommandText = "insert into ASISTENCIA(Cedula,Lunes,Martes,Miercoles,Jueves,Viernes) values('" & TextBox1.Text & "'," & CheckBox1.Checked & "," & CheckBox2.Checked & "," & CheckBox3.Checked & "," & CheckBox4.Checked & "," & CheckBox5.Checked & ")"
Quitando la comilla simple entre cada valor ya que al ser true no te hacen falta.
Con esto te ahorras declarar las variables check1... check5 y te ahorras el control de asignarle el valor de si o no

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas