none
Error al Guardar registro nuevo RRS feed

  • Pregunta

  • Al intentar guardar un nuevo registro me da el siguiente error:

    System.Data.OleDb.OleDbException(0x80040E07): No coinciden los tipos de datos en la expresión de criterios.

    Mi código del Boton Guardar es:

    Private Sub btnGuardarControl_Click(sender As Object, e As EventArgs) Handles btnGuardarControl.Click

                    Try

                        'Hacemos una consulta INSERT para añadir un registroa la BD

                        Comandos = New OleDbCommand("INSERT INTO Controles (Documento, Fecha_Control, Edad_Años, Edad_Meses, Edad_Dias, Peso, Talla, Perimetro_Cefalico, IMC, Edad_Decimal)" & vbCrLf &

                                                    "VALUES (@Documento, @Fecha_Control, @Edad_Años, @Edad_Meses, @Edad_Dias, @Peso, @Talla, @Perimetro_Cefalico, @IMC, @Edad_Decimal)", Conexion)

                        'Para agregar los valores de la consulta

                        Comandos.Parameters.AddWithValue("@Documento", txtDocuControl.Text)

                        Comandos.Parameters.AddWithValue("@Fecha_Nacimiento", dtpFechaControl.Value)

                        Comandos.Parameters.AddWithValue("@Edad_Años", txtAnosControl.Text)

                        Comandos.Parameters.AddWithValue("@Edad_Meses", txtMesesControl.Text)

                        Comandos.Parameters.AddWithValue("@Edad_Dias", txtDiasControl.Text)

                        Comandos.Parameters.AddWithValue("@Peso", txtPesoControl.Text)

                        Comandos.Parameters.AddWithValue("@Talla", txtTallaControl.Text)

                        Comandos.Parameters.AddWithValue("@Perimetro_Cefalico", txtPCcontrol.Text)

                        Comandos.Parameters.AddWithValue("@IMC", txtIMC.Text)

                        Comandos.Parameters.AddWithValue("@Edad_Decimal", txtEdad_Decimal.Text)

                        'Para que ejecute la consulta

                        Comandos.ExecuteNonQuery()

                        MsgBox("Guardado correctamente", vbInformation, "Correcto")

                        btnGuardarControl.Enabled = False

                        'End If

                    Catch ex As Exception

                        MsgBox(ex.ToString)

                    End Try

        End Sub

    miércoles, 12 de agosto de 2015 19:34

Respuestas

  • Hola Estedu,

    Intenta hacer lo siguiente:

    Comandos.Parameters.AddWithValue("@Fecha_Control", dtpFechaControl.Value.ToShortDateString())

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Marcado como respuesta Estedu viernes, 21 de agosto de 2015 19:39
    viernes, 21 de agosto de 2015 19:02
  • Comprueba que los tipos de datos de las variables que asignas a los parámetros coincidan con los de los campos de la base de datos.

    Es decir, que el campo Fecha_Control sea de tipo fecha y el resto de tipo texto. Si tienes campos numéricos realiza la conversión a un tipo numérico antes de asignarle el valor al parámetro.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Estedu viernes, 14 de agosto de 2015 2:38
    miércoles, 12 de agosto de 2015 23:40

Todas las respuestas

  • El parámetro fecha lo defines como Fecha_Control pero al asignarle el valor utilizas el nombre Fecha_Nacimiento.

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    miércoles, 12 de agosto de 2015 19:37
  • Es verdad, tengo ese error que corresponde diga Fecha_Control, pero corregido, el error sigue igual. 

    Amplio texto del error:

    System.Data.OleDb.OleDbException(0x80040E07): No coinciden los tipos de datos en la expresión de criterios. 

    en

    System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDb HResult hr)

    en

    System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Objet& executeResult)

    en System.Data.OleDb.OleDbCommand.ExecuteCommandExecuteCommandText(Objet& executeResult)

    Y siguen mas párrafos de esta misma índole.

    miércoles, 12 de agosto de 2015 20:49
  • Comprueba que los tipos de datos de las variables que asignas a los parámetros coincidan con los de los campos de la base de datos.

    Es decir, que el campo Fecha_Control sea de tipo fecha y el resto de tipo texto. Si tienes campos numéricos realiza la conversión a un tipo numérico antes de asignarle el valor al parámetro.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Estedu viernes, 14 de agosto de 2015 2:38
    miércoles, 12 de agosto de 2015 23:40
  • Reactivo este tema dado que sigo con el problema pero he comprobado que el error lo da la siguiente línea:

    Comandos.Parameters.AddWithValue("@Fecha_Control", dtpFecha_Control.Value)

    Esto lo digo porque elimino esta línea y sus relaciones en INSERT INTO Controles, y todos los demás registros se guardan correctamente sin errores, vuelvo a habilitar lo eliminado y aparece el mismo error, a pesar de algún intento de reemplazar "dtpFecha_Control.Value", por una variable declarada como "Date"

    En la Base de Datos, esta campo está con formato de fecha corta y el dtpFecha_Control, tiene su propiedad Format, en Short.

    viernes, 21 de agosto de 2015 2:03
  • Hola Estedu,

    ¿Qué tipo de dato tiene el campo [Fecha_Control]?¿date, datetime, smalldatetime, datetime2, varchar(n)?

    • Marcado como respuesta Estedu viernes, 21 de agosto de 2015 5:18
    • Desmarcado como respuesta Estedu viernes, 21 de agosto de 2015 5:18
    viernes, 21 de agosto de 2015 3:33
  • No lo se, lo que pasa es que no soy programador, solo estoy aprendiendo.

    ¿Cómo o donde puedo ver ese dato?

    Pero lo que veo al desplegar el menú del campo en "Origen de Datos", en personalizar, me aparece una ventana de opciones y allí en 'Tipo de datos' dice: DataTime.

    ¿Es eso?

    viernes, 21 de agosto de 2015 5:26
  • Me acabo de dar cuenta de que estás utilizando OleDb para realizar las consultas. Con OleDb los parámetros en la consulta no se especifican con nombres, sino con marcadores de posición con un interrogante (?).

    Deberías cambiar la consulta reemplazando los parámetros por interrogantes:

    'Hacemos una consulta INSERT para añadir un registroa la BD
    
    Comandos = New OleDbCommand("INSERT INTO Controles (Documento, Fecha_Control, Edad_Años, Edad_Meses, Edad_Dias, Peso, Talla, Perimetro_Cefalico, IMC, Edad_Decimal)" & vbCrLf &
        "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", Conexion)
    
    'Para agregar los valores de la consulta
    Comandos.Parameters.AddWithValue("@Documento", txtDocuControl.Text)
    Comandos.Parameters.AddWithValue("@Fecha_Control", dtpFechaControl.Value)
    
    ...


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...


    viernes, 21 de agosto de 2015 5:46
  • He hecho eso, pero todo sigue igual
    viernes, 21 de agosto de 2015 17:54
  • Se que no es lo correcto, pero si sirve de algo para tu ayuda, comento que he agregado un TextBox, el cual recibe el value del dtpFecha_Control y luego uso:

    Comandos.Parameters.AddWithValue("@Fecha_Control", txtFechaC.Text)

    Y así se guardo bien el registro y no me dio error .....??????

    viernes, 21 de agosto de 2015 18:20
  • Hola Estedu,

    ¿Qué formato de fecha definiste en el objeto TextBox?: dd/mm/yyyy, mm/dd/yyyy, yyyy/mm/dd

    Es probable que la base de datos espere un formato que tu se lo provees manualmente, pero que el objeto DateTimePicker no sabe resolver.

    Coloca un punto de interrupción en la línea donde asignas el valor del DateTimePicker al parámetro @Fecha_Control y revisa que valor es el que está pasando y en que formato lo está haciendo (Para colocar un punto de interrupción coloca el cursor en la línea mencionada y presiona la tecla [F9])

    Coméntanos como te fue

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    viernes, 21 de agosto de 2015 18:25
  • Asi paso el valor al TextBox:

    txtFechaC.Text = dtpFecha_Control.Value

    Y al seguir tus indicaciones lo que aparece al posicionar el cursor sobre la línea detenida:

    Si el cursor está sobre dtpFecha_Control:

    dtpFecha_Control {System.Windows.Forms.DateTimePicker, Value: 21/08/2015 03:45:33 p.m.}

    Y si el cursor está sobre Value:

    dtpFecha_Control.Value #8/21/2015 3:45:33 PM#

    viernes, 21 de agosto de 2015 18:51
  • Hola Estedu,

    Intenta hacer lo siguiente:

    Comandos.Parameters.AddWithValue("@Fecha_Control", dtpFechaControl.Value.ToShortDateString())

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Marcado como respuesta Estedu viernes, 21 de agosto de 2015 19:39
    viernes, 21 de agosto de 2015 19:02
  • Funciona, ya no da error, muchas gracias por tu ayuda

    viernes, 21 de agosto de 2015 19:41