none
No coinciden los tipos de datos en la expresión de criterios VB 2017 y access 2016 RRS feed

  • Pregunta

  • Buend día, estoy desarrollando una pequeña aplicación con "N" capas, ocupo visual studio 2017 con el lenguaje VB y una base de datos en access 2016 la base es *.accdb. 

    con el programa puedo insertar datos y consultar la tabla sin problema, pero a la hora que inetento actualizar los datos me sale el siguiente mensaje "No coinciden los tipos de datos en la expresión de criterios".

    esta es la función que ocupo para editar

     Public Function EditarUsuario(ByVal DtU As CE_Usuario) As Boolean
            
            Try
    
                Com_U.Connection = Dcon.Conectarbd
                Com_U.CommandText = "update Tabla1 set Usuario='" & DtU.Usr & "', Pass='" & DtU.Pass & "', NombreCompleto='" & DtU.NombreCompleto & "', TipoUsuario='" & DtU.TipoUsr & "'where IdUsuario='" & dtsUsr.IdUsr & "' "
                Com_U.CommandType = CommandType.Text
    
                If Com_U.ExecuteNonQuery() = 1 Then
                    Return True
                Else
                    Return False
                End If
    
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            Finally
                Com_U.Parameters.Clear()
                Dcon.Desconectarbd()
            End Try
    
        End Function

    Esta es mi clase CE_Usuario, con sus metodos y constructores.

    Public Class CE_Usuario
        Dim _IdUsr As Integer
        Dim _Usr As String
        Dim _Pass As String
        Dim _NombreCompleto As String
        Dim _TipoUsr As String
        Public Sub New()
    
        End Sub
    
        Public Sub New(ByVal IdUsr As Integer, ByVal Usuario As String, ByVal Password As String, ByVal NombreCompleto As String, ByVal TipoUsuario As String)
            _IdUsr = IdUsr
            _Usr = Usuario
            _Pass = Password
            _NombreCompleto = NombreCompleto
            _TipoUsr = TipoUsuario
    
        End Sub
    
        Public Property IdUsr As Integer
            Get
                Return _IdUsr
            End Get
            Set(value As Integer)
                _IdUsr = value
            End Set
        End Property
    
        Public Property Usr As String
            Get
                Return _Usr
            End Get
            Set(value As String)
                _Usr = value
            End Set
        End Property
    
        Public Property Pass As String
            Get
                Return _Pass
            End Get
            Set(value As String)
                _Pass = value
            End Set
        End Property
    
        Public Property NombreCompleto As String
            Get
                Return _NombreCompleto
            End Get
            Set(value As String)
                _NombreCompleto = value
            End Set
        End Property
    
        Public Property TipoUsr As String
            Get
                Return _TipoUsr
            End Get
            Set(value As String)
                _TipoUsr = value
            End Set
        End Property
    End Class

    esta es mi función desde la capa negocio

    Public Function EditarUSuario(ByVal CEU As CE_Usuario) As Boolean
            Try
    
                CDU.EditarUsuario(CEU)
                Return True
            Catch ex As Exception
                MsgBox("No se Pueden editar los Datos por: " + ex.Message)
                Return False
            End Try
        End Function

    y de aqui llamo a las funciones desde un boton llamado modificar en mi formulario

     Private Sub btnModificar_Click(sender As Object, e As EventArgs) Handles btnModificar.Click
            dtsUsr.IdUsr = txtIdUsuario.Text
            dtsUsr.Usr = txtUsuario.Text
            dtsUsr.Pass = txtPassword.Text
            dtsUsr.NombreCompleto = txtNomCompleto.Text
            dtsUsr.TipoUsr = txtTipoUsuario.Text
    
            If fncUsr.EditarUSuario(dtsUsr) = True Then
                llenardgvUsuarios()
                LimpiarTxt()
                btnModificar.Enabled = False
            Else
                MsgBox("No se modificarón los datos")
            End If
        End Sub

    ya intente convertir el idUsr.text en entero desde el formulario

    lconvertir la variable desde la capa negocio

    y convertirla directamente en la función desde el comando 

    el detalle esta directamente en DtU.IdUsr ya que he mandado cada dato por separado sin darle ninguna condición y si lo inserta, 

    Com_U.CommandText = "update Tabla1 set Usuario='" & DtU.Usr & "', Pass='" & DtU.Pass & "', NombreCompleto='" & DtU.NombreCompleto & "', TipoUsuario='" & DtU.TipoUsr & "'where IdUsuario='" & dtsUsr.IdUsr & "' "

    ya probe de todo cambiando el "&" por "+" los datos de la tabla los puse entre "[]" y nada, siempre sale el mismo mensaje

    espero me puedan ayudar

    Saludos a todos y muchas gracias por la ayuda

    domingo, 21 de octubre de 2018 2:27

Respuestas

  • ... & "'where IdUsuario='" & dtsUsr.IdUsr & "' "

    Pregunta: El campo IdUsuario, ¿qué tipo tiene en la base de datos? Si es de tipo numérico, entonces sobran las comillas con las que rodeas el valor con que lo comparas:

    ... & "'where IdUsuario=" & dtsUsr.IdUsr

    Al ponerle las comillas se indica que es un string, y si el campo es integer entonces se produce el error de "no coinciden los tipos".

    Como ya te han indicado en otra respuesta, este tipo de errores se eliminan si parametrizas debidamente la sentencia en lugar de concatenarle los datos.

    • Marcado como respuesta JIRG martes, 23 de octubre de 2018 0:47
    lunes, 22 de octubre de 2018 5:54

Todas las respuestas

  • Hola.

    Veo que el error puede estar en este apartado que te muestro, ya que está leyendo un texto (string) al que le falta la conversión a integer.

    Private Sub btnModificar_Click(sender As Object, e As EventArgs) Handles btnModificar.Click
            dtsUsr.IdUsr = txtIdUsuario.Text
            dtsUsr.Usr = txtUsuario.Text
            dtsUsr.Pass = txtPassword.Text
            dtsUsr.NombreCompleto = txtNomCompleto.Text
            dtsUsr.TipoUsr = txtTipoUsuario.Text

    Cambia o añade a dtsUsr.IdUsr los siguiente:

    dtsUsr.IdUsr = CInt(txtIdUsuario.Text)

    Ahora te tendría que funcionar, otra cosa, es importante que utilices parámetros en la construcción de tu sql, te evitarás problemas de inyección de código sql y por otro lado queda mucho mas limpio el código y legible.

    Por ejemplo, el update podría quedar así:

     Com_U.CommandText = "update Tabla1 set Usuario= @dtuUsr, Pass= @dtuPasw, NombreCompleto= @dtuNomComp, TipoUsuario= @dtuTipoUsuario where IdUsuario= dtuUsuario "
                With cmd.Parameters
                    .AddWithValue("@dtuUsr", DtU.Usr)
                    .AddWithValue("@dtuPasw", DtU.Pass)
                    .AddWithValue("@dtuNomComp", DtU.NombreCompleto)
                    .AddWithValue("@dtuTipoUsuario", DtU.TipoUsr)
                    .AddWithValue("@dtuUsuario", dtsUsr.IdUsr)
                End With

    Nunca pueden ir juntos por ejemplo lo que tienes en el where:TipoUsuario='" & DtU.TipoUsr & "'where IdUsuario='

    Al where le falta un espacio en blanco antes del mismo, eso es otro problema que dará si no te lo ha dado. DtU.TipoUsr & "' where

    Un saludo.

    Gemma.




    domingo, 21 de octubre de 2018 6:43
  • ... & "'where IdUsuario='" & dtsUsr.IdUsr & "' "

    Pregunta: El campo IdUsuario, ¿qué tipo tiene en la base de datos? Si es de tipo numérico, entonces sobran las comillas con las que rodeas el valor con que lo comparas:

    ... & "'where IdUsuario=" & dtsUsr.IdUsr

    Al ponerle las comillas se indica que es un string, y si el campo es integer entonces se produce el error de "no coinciden los tipos".

    Como ya te han indicado en otra respuesta, este tipo de errores se eliminan si parametrizas debidamente la sentencia en lugar de concatenarle los datos.

    • Marcado como respuesta JIRG martes, 23 de octubre de 2018 0:47
    lunes, 22 de octubre de 2018 5:54
  • Muchas gracias por responder.

    Gracias Alberto, al quitar las ' ' lo tomo como valor entero.

    Si sirve de algo intente parametrizar pero no modificaba la base de datos, lei que habia que deshabilitar algunas cosas en acces para que diera permisos de editar y no sirvio.

    .AddWithValue("@dtuUsr", DtU.Usr)     por     .add("@dtuUsr", oledbparameter.integer).value =DtU.Usr

    como dato extra, también lei que la primera opción funciona mas con sql y que por algún motivo que no recuerdo al insertar los datos en acces habia que dar el tipo de dato y tamaño para que se pudiera editar, pero tampoco me sirvió.


    martes, 23 de octubre de 2018 0:47