none
No coinciden los tipos de datos en la expresion de criterios BD AYUDA

    Pregunta

  • Hola tengo el siguiente GRAN problema, cuando uso la consulta INSERT en ciertas ocaciones me aparece ese mensaje No coinciden los tipos de datos en la expresion de criterios , por ende no se guardan los valores en la base de datos.

    Los valores que intento guardar son todos decimales y los tengo definidos en la tabla de la base de datos en Access como Decimales, no sé por qué aparece eso!!

    Ojalá alguien me pueda ayudar!

    Aquí les dejo el código

     Public Sub insertar1()
            Try

                Using cnnConex As New OleDb.OleDbConnection(strconexion)
                    cnnConex.Open()

                    Dim strSQL As String = "INSERT INTO WLTable (Seccion, PreSeccion, DiametroPulg, " & _
                                            "Factor1, Factor2, Factor3, Numero1, Numero2, Numero3, " & _
                                            "LargoSeccion, Unidad, CantidadL, CantidadB, CantidadT, FactorK, " & _
                                            "CantidadMinima, UnidadCantidad, PresionMinima, UnidadPresionMin, " & _
                                            "ValorC, Diametro, UnidadDiametro, PerdidaPresion, UnidadPerdida, " & _
                                            "Velocidad, UnidadVelocidad)" & _
                                            "VALUES (@seccion, @pre, @diam, @fac1, @fac2, @fac3, @num1, " & _
                                            "@num2, @num3, @larsec, @unidadlar, @cantl, @cantb, @cantt, @fack, @facq, " & _
                                            "@unidadq, @pmin, @unidadpmin, @valc, @diammm, @unidaddiam, @ploss, @unidadploss, @vel, @univel)"

                    Dim cmd As New OleDb.OleDbCommand(strSQL, cnnConex)
                    cmd.Parameters.AddWithValue("@seccion", txtSecc.Text)
                    cmd.Parameters.AddWithValue("@pre", txtPreSecc.Text)
                    cmd.Parameters.AddWithValue("@diam", txtDiametro.Text)
                    cmd.Parameters.AddWithValue("@fac1", fact1.Text)
                    cmd.Parameters.AddWithValue("@fac2", fact2.Text)
                    cmd.Parameters.AddWithValue("@fac3", fact3.Text)
                    cmd.Parameters.AddWithValue("@num1", Num1.Text)
                    cmd.Parameters.AddWithValue("@num2", Num2.Text)
                    cmd.Parameters.AddWithValue("@num3", Num3.Text)
                    cmd.Parameters.AddWithValue("@larsec", txtResLong.Text)
                    cmd.Parameters.AddWithValue("@unidadlar", txtm.Text)
                    cmd.Parameters.AddWithValue("@cantl", txtL.Text)
                    cmd.Parameters.AddWithValue("@cantb", txtB.Text)
                    cmd.Parameters.AddWithValue("@cantt", txtT.Text)
                    cmd.Parameters.AddWithValue("@fack", txtK.Text)
                    cmd.Parameters.AddWithValue("@facq", txtCantMin.Text)
                    cmd.Parameters.AddWithValue("@unidadq", txtlmin.Text)
                    cmd.Parameters.AddWithValue("@pmin", txtPMin.Text)
                    cmd.Parameters.AddWithValue("@unidadpmin", txtbar.Text)
                    cmd.Parameters.AddWithValue("@valc", txtC.Text)
                    cmd.Parameters.AddWithValue("@diammm", lblDiamPrueba.Text)
                    cmd.Parameters.AddWithValue("@unidaddiam", txtmm.Text)
                    cmd.Parameters.AddWithValue("@ploss", txtPLoss.Text)
                    cmd.Parameters.AddWithValue("@unidadploss", txtbar.Text)
                    cmd.Parameters.AddWithValue("@vel", txtVel.Text)
                    cmd.Parameters.AddWithValue("@univel", txtmseg.Text)
                  
                    cmd.ExecuteNonQuery()

                End Using

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    martes, 15 de febrero de 2011 16:57

Respuestas

  • "JuanPabloSepulveda" escribió:

    > cuando uso la consulta INSERT en ciertas ocaciones me aparece ese
    > mensaje No coinciden los tipos de datos en la expresion de criterios,
    > por ende no se guardan los valores en la base de datos.
    >
    > Los valores que intento guardar son todos decimales y los tengo
    > definidos en la tabla de la base de datos en Access como Decimales

    Si dices que los campos los tienes definidos con el tipo de dato Decimal, con una Precisión de 18 y una Escala de 2, o cualquier otra Precisión y Escala permitida, entiendo que no tienes que convertir los números de los controles TextBox a System.Decimal, ni tienes que cambiar la configuración regional de tu aplicación, ni nada de nada. El texto que le pases al método «AddWithValue» se tomará como Decimal de Access, que es el tipo de dato que dices que tienes definido en la tabla. De hecho, acabo de realizar una prueba, y se ha insertado el valor del control TextBox en el campo de la tabla de Access definido como numérico Decimal.

    Pero si la propiedad Text de algún control TextBox es una cadena de longitud cero (String.Empty), o es un valor que no se puede convertir a Decimal de Access, indudablemente vas a obtener el error que estás obteniendo.

    Se supone que los parámetros los estás añadiendo a la colección Parameters EN EL MISMO ORDEN EN EL QUE SE ENCUENTRAN DEFINIDOS EN LA CONSULTA SQL de datos añadidos, cosa que así veo que haces si he revisado bien tu código.

    Establece un punto de interrupción en la línea

        cmd.Parameters.AddWithValue("@seccion", txtSecc.Text)

    y revisa cada uno de los valores de los distintos controles TextBox, para ver si alguno de ellos tiene una cadena de longitud cero, o un valor no numérico.

    > A los que le coloqué CDec me guarda en la base de datos como 1608,000 en vez de 1,608

    ¡Normal que así aparezcan! No hagas la conversión explícita a System.Decimal, porque el tipo de dato OleDbType.Decimal de .NET (que es el que admitiría el parámetro del tipo System.Decimal), entiendo que no es igual al tipo de dato Decimal de Access. Lo mismo estoy equivocado, pero por las pruebas que he realizado, así me lo confirma.

     


    Enrique Martínez
      [MS MVP - VB]

    martes, 15 de febrero de 2011 19:43
    Moderador
  • "Angel Jimenez" escribió:

    > sustituye esta seccion
    >
    > ."VALUES (@seccion, ...
    >
    > por esta
    >
    > "VALUES (CAST(@seccion AS NCHAR(10)), ...
    >
    > Por breveda coloque todos los paramentros como  NCHAR(10) tu debe
    > sustiyuirlo por su respectivos tipo en la base de datos; osea como
    > aparece en la definicion de la columna de la tabla en la base de datos.

    Hola, Ángel:

    Creo que el usuario JuanPabloSepulveda está utilizando una base de Access, por tanto, me parece a mí que no va a poder utilizar la función de conversión CAST.

    Insisto que no tiene que hacer nada en absoluto. Simplemente se tiene que preocupar que los valores de los distintos controles TextBox se puedan convertir al tipo de datos Decimal de Microsoft Access. ¡Nada más! Pero si algún control TextBox no contiene texto alguno, o esté contiene caracteres alfabéticos, ¡zas! No coinciden los tipos de datos en la expresion de criterios. :-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    miércoles, 16 de febrero de 2011 3:58
    Moderador

Todas las respuestas

  • hola

    algo que note es que entre estas dos lineas

    "ValorC, Diametro, UnidadDiametro, PerdidaPresion, UnidadPerdida, " & _
                                            "Velocidad, UnidadVelocidad)" & _
                                            "VALUES (@seccion, @pre, @diam, @fac1, @fac2, @fac3, @num1, " & _

    no has dejado un espacio e el ) por lo tanto el VALUES se pega al mismo, esto podria causar problemas

     

    - tambien recuerda que al usar AddWithValue() debes pasa el tipo de dato correcto, si es decimal usarias

    cmd.Parameters.AddWithValue("@pre", CDec (txtPreSecc.Text))

    es importante definir el tipo de datos, sino tomara este como texto

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 15 de febrero de 2011 17:05
  • Hola! Haré lo del CDec, pero no logro entender lo del no has dejado un espacio e el ) por lo tanto el VALUES se pega al mismo, esto podria causar problemas
    martes, 15 de febrero de 2011 17:11
  • Hola!

    A los que le coloqué CDec me guarda en la base de datos como 1608,000 en vez de 1,608

    martes, 15 de febrero de 2011 17:21
  • esa es la configuracion regional

    seguramente tiene definido para que tome la coma como separador de miles,

    puede usar

    Dim val As Double = Convert.ToDouble("1,608", CultureInfo.CreateSpecificCulture("es-ES"))

    en lugar del simple CDec

    o sino cambia la cultura completa de la aplicacion usando

    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es-ES");

    esto lo pondrias en el inicio de la aplicacion

    ya que segun veo estas tomando al coma como separador de decimales

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 15 de febrero de 2011 17:39
  • "JuanPabloSepulveda" escribió:

    > cuando uso la consulta INSERT en ciertas ocaciones me aparece ese
    > mensaje No coinciden los tipos de datos en la expresion de criterios,
    > por ende no se guardan los valores en la base de datos.
    >
    > Los valores que intento guardar son todos decimales y los tengo
    > definidos en la tabla de la base de datos en Access como Decimales

    Si dices que los campos los tienes definidos con el tipo de dato Decimal, con una Precisión de 18 y una Escala de 2, o cualquier otra Precisión y Escala permitida, entiendo que no tienes que convertir los números de los controles TextBox a System.Decimal, ni tienes que cambiar la configuración regional de tu aplicación, ni nada de nada. El texto que le pases al método «AddWithValue» se tomará como Decimal de Access, que es el tipo de dato que dices que tienes definido en la tabla. De hecho, acabo de realizar una prueba, y se ha insertado el valor del control TextBox en el campo de la tabla de Access definido como numérico Decimal.

    Pero si la propiedad Text de algún control TextBox es una cadena de longitud cero (String.Empty), o es un valor que no se puede convertir a Decimal de Access, indudablemente vas a obtener el error que estás obteniendo.

    Se supone que los parámetros los estás añadiendo a la colección Parameters EN EL MISMO ORDEN EN EL QUE SE ENCUENTRAN DEFINIDOS EN LA CONSULTA SQL de datos añadidos, cosa que así veo que haces si he revisado bien tu código.

    Establece un punto de interrupción en la línea

        cmd.Parameters.AddWithValue("@seccion", txtSecc.Text)

    y revisa cada uno de los valores de los distintos controles TextBox, para ver si alguno de ellos tiene una cadena de longitud cero, o un valor no numérico.

    > A los que le coloqué CDec me guarda en la base de datos como 1608,000 en vez de 1,608

    ¡Normal que así aparezcan! No hagas la conversión explícita a System.Decimal, porque el tipo de dato OleDbType.Decimal de .NET (que es el que admitiría el parámetro del tipo System.Decimal), entiendo que no es igual al tipo de dato Decimal de Access. Lo mismo estoy equivocado, pero por las pruebas que he realizado, así me lo confirma.

     


    Enrique Martínez
      [MS MVP - VB]

    martes, 15 de febrero de 2011 19:43
    Moderador
  • sustituye esta seccion

    "VALUES (@seccion, @pre, @diam, @fac1, @fac2, @fac3, @num1, " & _
                        "@num2, @num3, @larsec, @unidadlar, @cantl, @cantb, @cantt, @fack, @facq, " & _
                        "@unidadq, @pmin, @unidadpmin, @valc, @diammm, @unidaddiam, @ploss, @unidadploss, @vel, @univel)"
    
    

    por esta

    "VALUES (CAST(@seccion AS NCHAR(10)), CAST(@pre AS NCHAR(10)), CAST(@diam AS NCHAR(10)), CAST(@fac1 AS NCHAR(10)), CAST(@fac2 AS NCHAR(10)), CAST(@fac3 AS NCHAR(10)), CAST(@num1 AS NCHAR(10)), " & _
                        "CAST(@num2 AS NCHAR(10)), CAST(@num3 AS NCHAR(10)), CAST(@larsec AS NCHAR(10)), CAST(@unidadlar AS NCHAR(10)), CAST(@cantl AS NCHAR(10)), CAST(@cantb AS NCHAR(10)), CAST(@cantt AS NCHAR(10)), CAST(@fack AS NCHAR(10)), CAST(@facq AS NCHAR(10)), " & _
                        "CAST(@unidadq AS NCHAR(10)), CAST(@pmin AS NCHAR(10)), CAST(@unidadpmin AS NCHAR(10)), CAST(@valc AS NCHAR(10)), CAST(@diammm AS NCHAR(10)), CAST(@unidaddiam AS NCHAR(10)), CAST(@ploss AS NCHAR(10)), CAST(@unidadploss AS NCHAR(10)), CAST(@vel AS NCHAR(10)), CAST(@univel AS NCHAR(10)))"
    
    

    Por breveda coloque todos los paramentros como  NCHAR(10) tu debe sustiyuirlo por su respectivos tipo en la base de datos; osea como aparece en la definicion de la columna de la tabla en la base de datos.

     


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    martes, 15 de febrero de 2011 21:55
  • "Angel Jimenez" escribió:

    > sustituye esta seccion
    >
    > ."VALUES (@seccion, ...
    >
    > por esta
    >
    > "VALUES (CAST(@seccion AS NCHAR(10)), ...
    >
    > Por breveda coloque todos los paramentros como  NCHAR(10) tu debe
    > sustiyuirlo por su respectivos tipo en la base de datos; osea como
    > aparece en la definicion de la columna de la tabla en la base de datos.

    Hola, Ángel:

    Creo que el usuario JuanPabloSepulveda está utilizando una base de Access, por tanto, me parece a mí que no va a poder utilizar la función de conversión CAST.

    Insisto que no tiene que hacer nada en absoluto. Simplemente se tiene que preocupar que los valores de los distintos controles TextBox se puedan convertir al tipo de datos Decimal de Microsoft Access. ¡Nada más! Pero si algún control TextBox no contiene texto alguno, o esté contiene caracteres alfabéticos, ¡zas! No coinciden los tipos de datos en la expresion de criterios. :-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    miércoles, 16 de febrero de 2011 3:58
    Moderador