none
'No coinciden los tipos de datos en la expresión de criterios.' RRS feed

  • Pregunta

  • me muestra este mensaje: system.Data.OleDb.OleDbException: 'No coinciden los tipos de datos en la expresión de criterios.'    en la linea donde dice: adaptador.Fill(registro, "usuario") que puedo hacer para que me ejecute la intruccion

    Imports System.Data.OleDb
    Public Class buscar1vb
        Dim conexion As New OleDbConnection
        Dim adaptador As OleDbDataAdapter
        Dim registro As DataSet
        Private Sub buscar1vb_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            conexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\USUARIO\Documents\proyectohogar1.accdb"
        End Sub
    
        Private Sub buscar_Click(sender As Object, e As EventArgs) Handles buscar.Click
            Dim buscar As String
            Dim lista As Byte
    
            If documento.Text <> " " Then
                buscar = "SELECT * FROM usuario WHERE documento =  '" & documento.Text & "'"
                adaptador = New OleDbDataAdapter(buscar, conexion)
                registro = New DataSet
                adaptador.Fill(registro, "usuario")
                lista = registro.Tables("usuario").Rows.Count
                If lista <> 0 Then
    
                Else
    
                    MsgBox("NO SE ENCONTRO REGISTRO CON ESE DOCUMENTO", vbCritical, "atencion")
                    documento.Clear()
                    documento.Focus()
    
                End If
                conexion.Close()
            End If
        End Sub
    End Class


    miércoles, 17 de enero de 2018 15:02

Respuestas

  • Típicamente ese mensaje de error indica que existe un error en la parte del "where" de la consulta SQL, concretamente que no coincide el tipo de columna con el valor que comparas. En tu caso tienes esto:

    buscar = "SELECT * FROM usuario WHERE documento =  '" & documento.Text & "'"

    Si el campo "documento" de tu tabla es, por ejemplo, de tipo numérico, obtendrías el error que ves debido a que has encerrado el docmento.Text entre comillas simples, lo cual indica que es de tipo cadena (en lugar de numérico). [Solución: quitar las comillas simples]

    Por cierto, observa que en ese código tienes un agujero de seguridad gordísimo: Si el usuario teclea en el textbox algo de código SQL, se concatena con el resto de la sentencia y se envía a ejecutar al servidor, con lo que cualquier usuario podría consultar y alterar cualquier dato que haya en tu base de datos. Esto se llama "ataque de inyección de SQL", y se evita parametrizando la sentencia (lo cual dicho sea de paso eliminaría las comillas y no habrías tenido el error de "no coinciden los tipos", siempre que la parametrización sea correcta).

    miércoles, 17 de enero de 2018 16:34
  • hola

    la columna documento de que tipo es? porque si es numerica no van las comillas simples

    ademas deberias usar parametros

    buscar = "SELECT * FROM usuario WHERE documento =  @documento"
    OleDbCommand cmd = new OleDbCommand(buscar, conexion)
    cmd.Parameters.AddWithValue("@documento", Convert.ToInt32(documento.Text))
    
    OleDbDataAdapter adaptador = New OleDbDataAdapter(cmd)
    registro = New DataTable
    adaptador.Fill(registro)
    la idea es respetar el tipo de datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 17 de enero de 2018 17:46

Todas las respuestas

  • Típicamente ese mensaje de error indica que existe un error en la parte del "where" de la consulta SQL, concretamente que no coincide el tipo de columna con el valor que comparas. En tu caso tienes esto:

    buscar = "SELECT * FROM usuario WHERE documento =  '" & documento.Text & "'"

    Si el campo "documento" de tu tabla es, por ejemplo, de tipo numérico, obtendrías el error que ves debido a que has encerrado el docmento.Text entre comillas simples, lo cual indica que es de tipo cadena (en lugar de numérico). [Solución: quitar las comillas simples]

    Por cierto, observa que en ese código tienes un agujero de seguridad gordísimo: Si el usuario teclea en el textbox algo de código SQL, se concatena con el resto de la sentencia y se envía a ejecutar al servidor, con lo que cualquier usuario podría consultar y alterar cualquier dato que haya en tu base de datos. Esto se llama "ataque de inyección de SQL", y se evita parametrizando la sentencia (lo cual dicho sea de paso eliminaría las comillas y no habrías tenido el error de "no coinciden los tipos", siempre que la parametrización sea correcta).

    miércoles, 17 de enero de 2018 16:34
  • hola

    la columna documento de que tipo es? porque si es numerica no van las comillas simples

    ademas deberias usar parametros

    buscar = "SELECT * FROM usuario WHERE documento =  @documento"
    OleDbCommand cmd = new OleDbCommand(buscar, conexion)
    cmd.Parameters.AddWithValue("@documento", Convert.ToInt32(documento.Text))
    
    OleDbDataAdapter adaptador = New OleDbDataAdapter(cmd)
    registro = New DataTable
    adaptador.Fill(registro)
    la idea es respetar el tipo de datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 17 de enero de 2018 17:46