none
Datareader muestra datos anteriores, ayudad RRS feed

  • Pregunta

  • Buenas tardes una consulta tengo una conexion con una bd Acces 2013 y trabajo en un proyecto de vb 2010.

    tengo un formulario donde hago consultas a la bd mediante un textbox hago la consulta usando la propiedad lostfocus, el detalle es que al hacer la primera consulta si me trae los datos pero al realizar la siguiente consulta en el mismo textbox, si encuentra el dato pero me rellena con los datos de la primer consulta.

    Aqui dejo el codigo, espero puedan resolver mi problema

      Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
            Dim ejecuta_sql As String


            If TextBox1.Text <> "" Then

                'Instruccion sql para buscar datos del empleado
                ejecuta_sql = "Select * from Empleados WHERE RFC=@param_id"

                sql1.CommandText = ejecuta_sql
                sql1.Parameters.AddWithValue("@param_id", TextBox1.Text)
                Dim lectura As OleDb.OleDbDataReader = sql1.ExecuteReader()

                If lectura.Read = True Then

                    'Una vez que encontramos el empleado, buscamos la ultima fila 
                    'contruimos una nueva conexion
                    sql3.Connection = conectar
                    sql3.CommandType = CommandType.Text

                    'Creamos la sentencia sql para buscar el datos
                    ejecuta_sql = "select count(id_asistencia) from Asistencia"

                    'Ejecutamos la instrucion sql
                    sql3.CommandText = ejecuta_sql

                    'pasamos el parametro a la variable y ejecutamos la consulta sql
                    Dim contador As OleDb.OleDbDataReader = sql3.ExecuteReader()

                    'creamos una variable para almacenar nuestro dato y usarlo para el registro de asistencia
                    Dim temporal As Integer
                    contador.Read()
                    temporal = CStr(contador(0)) + 1

                    txt_nombre.Text = CStr(lectura(1)) & " " & CStr(lectura(2)) & " " & CStr(lectura(3))
                    txt_area.Text = CStr(lectura(5))
                    txt_entrada.Text = DateTime.Now.ToLongTimeString()
                    txt_salida.Text = DateTime.Now.ToShortTimeString()
                    txt_fecha.Text = DateTime.Now.ToString("dd/MM/yyyy")
                    txt_idasistencia.Text = CStr(contador(0)) + 1
                    l_entrada.Text = CStr(lectura(6))
                    'l_salida.Text = CStr(lectura(8))
                    contador.Close()



                Else
                    MsgBox("sin datos para mostrar")
                    'lectura.Close()

                End If
                
                lectura.Close()


            Else
                TextBox1.Focus()
            End If


        End Sub

    viernes, 4 de agosto de 2017 16:55

Respuestas

  • Hola Encarnación:

    Prueba con esto: Justo antes de iniciar el parámetro pon Sql1.parameters.clear

    Un saludo.

    Gemma

    • Marcado como respuesta Encarnacion_RF viernes, 4 de agosto de 2017 17:17
    viernes, 4 de agosto de 2017 17:10
  • Hola Encarnación:

     Una de las primeras cosas que sugeriría cambiar es la forma de trabajar la interacción con la bd, ya que actualmente veo que trabajas directamente en los eventos, te recomendaría encapsular estas funcionalidades en una capa exclusiva de acceso a datos, si hacer una capa exclusiva te es imposible entonces podrías  crear una clase o por lo menos funciones o métodos aisladas, estos métodos o funciones podrías reutilizarla en muchos lugares sin tener que escribir una linea de mas:

     Bien, en relación a tu pregunta, por favor cambia esta linea:

    Dim lectura As OleDb.OleDbDataReader = sql1.ExecuteReader()
    

     Por esta otra:

    Dim lectura As New OleDb.OleDbDataReader = sql1.ExecuteReader()

    Para que por cada llamada al evento LostFocus() se cree un nuevo objeto del tipo OleDbDataReader().

    No olvides comentarnos tus resultados.


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marcado como respuesta Encarnacion_RF viernes, 4 de agosto de 2017 17:17
    viernes, 4 de agosto de 2017 17:11

Todas las respuestas

  • Hola Encarnación:

    Prueba con esto: Justo antes de iniciar el parámetro pon Sql1.parameters.clear

    Un saludo.

    Gemma

    • Marcado como respuesta Encarnacion_RF viernes, 4 de agosto de 2017 17:17
    viernes, 4 de agosto de 2017 17:10
  • Hola Encarnación:

     Una de las primeras cosas que sugeriría cambiar es la forma de trabajar la interacción con la bd, ya que actualmente veo que trabajas directamente en los eventos, te recomendaría encapsular estas funcionalidades en una capa exclusiva de acceso a datos, si hacer una capa exclusiva te es imposible entonces podrías  crear una clase o por lo menos funciones o métodos aisladas, estos métodos o funciones podrías reutilizarla en muchos lugares sin tener que escribir una linea de mas:

     Bien, en relación a tu pregunta, por favor cambia esta linea:

    Dim lectura As OleDb.OleDbDataReader = sql1.ExecuteReader()
    

     Por esta otra:

    Dim lectura As New OleDb.OleDbDataReader = sql1.ExecuteReader()

    Para que por cada llamada al evento LostFocus() se cree un nuevo objeto del tipo OleDbDataReader().

    No olvides comentarnos tus resultados.


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marcado como respuesta Encarnacion_RF viernes, 4 de agosto de 2017 17:17
    viernes, 4 de agosto de 2017 17:11
  • Gracias ya lo probe y si funciona muy bien jeje, estaba perdido
    viernes, 4 de agosto de 2017 17:18
  • Gracias hice la prueba y funciono
    viernes, 4 de agosto de 2017 17:20