none
Error en Consulta de Campo tipo Texto

    Pregunta

  • Saludos comunidad, presento el siguiente inconveniente. Ante todo les menciono que o soy muy experto en este lenguaje; Tengo un abase de datos access con un campo "placa" tipo texto indexado por el mismo campo, el cual deseo realizar una busqeda de registro a traves de dicho campo. Tengo el siguiente codigo y me arroja el siguiente error, que podria estar haciendo mal?

    http://prntscr.com/jup2ud

       Function Buscar_Registro(ByVal xPlaca As String) As Boolean

          
            'Conexion: Es el puente entre la Base de datos y la aplicación que se esta creando [PUENTE]
            Dim Cnn As New OleDbConnection
            Cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + My.Computer.FileSystem.CurrentDirectory + "\CEDIMAPRI.accdb;Persist Security Info=True;Jet OLEDB:Database Password=CONTRASEÑA"

            'Cadena SQL: Es el mensajero que va a ir de la aplicación a la base de datos [MENSAJERO]
            Dim CadenaSql As String = "SELECT * FROM Vehiculo WHERE Placa = " & xPlaca


            'Adaptador: Es una vasija que recibe datos de todo tipo, planos, sql, Access, posgre, etc [VASIJA]
            Dim Adaptador As New OleDbDataAdapter(CadenaSql, Cnn)


            'Data Set: Es el esqueleto de la base de datos.. Posee tablas, registros y campos [ESQUELETO]
            Dim DS As New DataSet


            'LLenar el Data Set
            Cnn.Open() 'Abre la conexion
            Adaptador.Fill(DS) 'Adaptador llena con datos al Data Set   <--- ahí ne genera el error (No se han especificado valores para algunos de los parámetros requeridos.)
            Cnn.Close()

            'Contar registros

            If (DS.Tables(0).Rows.Count = 0) Then
                'SI NO ENCONTRO EL REGISTRO
                Return False
            Else
                'ENCONTRO EL REGISTRO
                'Cargar los texbox del formulario con los datos del registro encontrado
                TX_Marca.Text = DS.Tables(0).Rows(0)("Marca").ToString
                TX_Modelo.Text = DS.Tables(0).Rows(0)("Modelo").ToString
                TX_Color.Text = DS.Tables(0).Rows(0)("Color").ToString
                TX_Ano.Text = DS.Tables(0).Rows(0)("Año").ToString
                DS.Dispose() 'Destruye la información del Data Set
                Return True

            End If
        End Function

    Desde ya gracias por la ayuda que me puedan dar


    jueves, 14 de junio de 2018 0:02

Respuestas

  • "Gregorio_77" escribió:

    > Tengo el siguiente codigo y me arroja el siguiente error, que podria estar haciendo mal?
    >
    > "No se han especificado valores para algunos de los parámetros requeridos."

    Hola, Gregorio:

    El motivo del error se debe a que has especificado una cláusula WHERE y en lugar de añadir el parámetro delimitado con comillas simples, lo has concatenado al nombre del campo "Placa"

    > 'Cadena SQL: Es el mensajero que va a ir de la aplicación a la base de datos [MENSAJERO]
    > Dim CadenaSql As String = "SELECT * FROM Vehiculo WHERE Placa = " & xPlaca

    Podrías ejecutar la consulta de ésta manera:

        Dim CadenaSql As String = "SELECT * FROM Vehiculo WHERE Placa = '" & xPlaca & "'"

    Pero mejor será que añadas un parámetro a un objeto OleDbCommand a fin de evitar un ataque de inyección SQL. Sustituye tu función Buscar_Registro por esta otra implementación:

        Function Buscar_Registro(ByVal xPlaca As String) As Boolean
    
             'Conexion: Es el puente entre la Base de datos y la aplicación que se esta creando [PUENTE]
             Using cnn As New OleDbConnection()
                 Cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + My.Computer.FileSystem.CurrentDirectory + "\CEDIMAPRI.accdb;Persist Security Info=True;Jet OLEDB:Database Password=CONTRASEÑA"
    
                 ' Crear el comando que vamos a ejecutar.
                 Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                 'Cadena SQL: Es el mensajero que va a ir de la aplicación a la base de datos [MENSAJERO]
                 cmd.CommandText = "SELECT * FROM Vehiculo WHERE Placa = @param1"
    
                 ' Añadir el parámetro de entrada al comando.
                 cmd.Parameters.AddWithValue("@param1", xPlaca)
    
                 'Adaptador: Es una vasija que recibe datos de todo tipo, planos, sql, Access, posgre, etc [VASIJA]
                 Dim Adaptador As New OleDbDataAdapter(cmd)
    
                 'Data Table: la tabla de la base de datos que vamos a rellenar [ESQUELETO]
                 Dim dt As New DataTable()
    
                 'LLenar el Data Table
                 Adaptador.Fill(dt)
    
                 'Contar registros
                 If (dt.Rows.Count = 0) Then
                     'SI NO ENCONTRO EL REGISTRO
                     Return False
    
                 Else
                     'ENCONTRO EL REGISTRO
                     'Cargar los texbox del formulario con los datos del registro encontrado
                     TX_Marca.Text = dt.Rows(0)("Marca").ToString()
                     TX_Modelo.Text = dt.Rows(0)("Modelo").ToString()
                     TX_Color.Text = dt.Rows(0)("Color").ToString()
                     TX_Ano.Text = dt.Rows(0)("Año").ToString()
                     dt.Dispose() 'Destruye la información del Data Table
                     Return True
    
                 End If
        
        End Function

    Con tu permiso he editado tu mensaje para eliminar la contraseña de la base de datos de Access que aparecía en la cadena de conexión, porque creo que estarás de acuerdo en mantenerla en secreto. ;-)

    De todas manera te diré que al especificar la contraseña como texto plano, cualquiera que abra el ejecutable de tu aplicación con un editor de texto la podrá leer sin ningún tipo de problema.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 14 de junio de 2018 7:37
    Moderador

Todas las respuestas

  • "Gregorio_77" escribió:

    > Tengo el siguiente codigo y me arroja el siguiente error, que podria estar haciendo mal?
    >
    > "No se han especificado valores para algunos de los parámetros requeridos."

    Hola, Gregorio:

    El motivo del error se debe a que has especificado una cláusula WHERE y en lugar de añadir el parámetro delimitado con comillas simples, lo has concatenado al nombre del campo "Placa"

    > 'Cadena SQL: Es el mensajero que va a ir de la aplicación a la base de datos [MENSAJERO]
    > Dim CadenaSql As String = "SELECT * FROM Vehiculo WHERE Placa = " & xPlaca

    Podrías ejecutar la consulta de ésta manera:

        Dim CadenaSql As String = "SELECT * FROM Vehiculo WHERE Placa = '" & xPlaca & "'"

    Pero mejor será que añadas un parámetro a un objeto OleDbCommand a fin de evitar un ataque de inyección SQL. Sustituye tu función Buscar_Registro por esta otra implementación:

        Function Buscar_Registro(ByVal xPlaca As String) As Boolean
    
             'Conexion: Es el puente entre la Base de datos y la aplicación que se esta creando [PUENTE]
             Using cnn As New OleDbConnection()
                 Cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + My.Computer.FileSystem.CurrentDirectory + "\CEDIMAPRI.accdb;Persist Security Info=True;Jet OLEDB:Database Password=CONTRASEÑA"
    
                 ' Crear el comando que vamos a ejecutar.
                 Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                 'Cadena SQL: Es el mensajero que va a ir de la aplicación a la base de datos [MENSAJERO]
                 cmd.CommandText = "SELECT * FROM Vehiculo WHERE Placa = @param1"
    
                 ' Añadir el parámetro de entrada al comando.
                 cmd.Parameters.AddWithValue("@param1", xPlaca)
    
                 'Adaptador: Es una vasija que recibe datos de todo tipo, planos, sql, Access, posgre, etc [VASIJA]
                 Dim Adaptador As New OleDbDataAdapter(cmd)
    
                 'Data Table: la tabla de la base de datos que vamos a rellenar [ESQUELETO]
                 Dim dt As New DataTable()
    
                 'LLenar el Data Table
                 Adaptador.Fill(dt)
    
                 'Contar registros
                 If (dt.Rows.Count = 0) Then
                     'SI NO ENCONTRO EL REGISTRO
                     Return False
    
                 Else
                     'ENCONTRO EL REGISTRO
                     'Cargar los texbox del formulario con los datos del registro encontrado
                     TX_Marca.Text = dt.Rows(0)("Marca").ToString()
                     TX_Modelo.Text = dt.Rows(0)("Modelo").ToString()
                     TX_Color.Text = dt.Rows(0)("Color").ToString()
                     TX_Ano.Text = dt.Rows(0)("Año").ToString()
                     dt.Dispose() 'Destruye la información del Data Table
                     Return True
    
                 End If
        
        End Function

    Con tu permiso he editado tu mensaje para eliminar la contraseña de la base de datos de Access que aparecía en la cadena de conexión, porque creo que estarás de acuerdo en mantenerla en secreto. ;-)

    De todas manera te diré que al especificar la contraseña como texto plano, cualquiera que abra el ejecutable de tu aplicación con un editor de texto la podrá leer sin ningún tipo de problema.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 14 de junio de 2018 7:37
    Moderador
  • Muchas gracias, me sirvio mucho la corrección, por otro lado voy a tomar en cuenta lo del password.

    Agradecido

    jueves, 14 de junio de 2018 16:02