Jump to content

procedimiento almacenado y mysqldatareader


Recommended Posts

tengo el siguiente lio

 

tengo creada una clase donde tengo todos mis procedimientos almacenados donde esta el buscar, guardar, editar, eliminar

 

 

 

y desde el formulario creo un objeto de mi clase y hago las llamadas a cada procedimiento

 

hice una tabla con 3 campos para probar

 

rut,nombre,apellido (la tipica xD)

 

 

tengo problemas especificamente en la llamada de un select

 

muestro el codigo de mi clase

Public Function buscar(ByVal rut As String) As MySqlCommand
        Try
            cn.Open()
            Dim cmd As New MySqlCommand("buscar", cn)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddWithValue("rut1", rut)
            cn.Close()
            Return cmd
        Catch ex As Exception

        End Try
End Function

y aqui el codigo de mi boton buscar

 Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click
        Dim cmd As New MySqlCommand
        Dim reader As MySqlDataReader
        cmd = oDatos.buscar(txtrut.Text)
        reader = cmd.ExecuteReader
        While reader.Read
            txtnombre.Text = reader("nombre")
            txtapellido.Text = reader("apellido")
        End While
End Sub

ahora, la primera vez que apreto el boton y busco un dato este me lo devuelve, es decir me lo muestra sin problemas y relleno las cajas de texto

 

pero cuando vuelvo a hacer una busqueda me sale el siguiente error

 

 

no se controlo NullReferenceException

referencia a objeto no establecida como instancia de un objeto

 

me lo marca en esta linea

 

reader = cmd.ExecuteReader

 

 

debo decir que el resto de los procedimientos me funcionan sin dramas

 

no coloco la cadena de coneccion ni el resto del codigo porque creo que no hace falta

 

 

 

cualquier ayuda es bienvenida gracias

 

 

 

 

 

Link to comment
Share on other sites

Intenta hacer los siguientes cambios:

Public Function buscar(ByVal rut As String) As MySqlCommand
    Dim cmd As MySqlCommand = Nothing

    Try
        cmd = New MySqlCommand("buscar", cn)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@rut1", rut)
    Catch ex As Exception
        MessageBox.Show("Error en comando buscar")
    End Try

    Return cmd
End Function
Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click
    Dim cmd As MySqlCommand
    Dim reader As MySqlDataReader

    Try
        cn.Open()
        cmd = oDatos.buscar(txtrut.Text)
        reader = cmd.ExecuteReader()
        While reader.Read()
            txtnombre.Text = reader("nombre")
            txtapellido.Text = reader("apellido")
        End While
        reader.Close()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        cn.Close()
    End Try
End Sub
:mmm: Supongo que oDatos es un objeto de la clase que hiciste tú, así que posiblemente no tengas acceso a cn desde el método btnbuscar_Click, entonces tendrías agregar (si es que todavía no los tienes) un par de métodos a dicha clase: uno para abrir la conexión a la base de datos y otro para cerrarla. Así que las llamadas cn.Open() y cn.Close() que puse, tendrías que cambiarlas por algo como oDatos.AbrirConexion() y oDatos.CerrarConexion(), respectivamente (o algo similar). Edited by susodicho
Link to comment
Share on other sites

Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click
        Dim cmd As New MySqlCommand
        Dim reader As MySqlDataReader
        cmd = oDatos.buscar(txtrut.Text)
        reader = cmd.ExecuteReader
        While reader.Read
            txtnombre.Text = reader("nombre")
            txtapellido.Text = reader("apellido")
        End While
End Sub

Te falta cerrar el cmd o no :mmm:

 

 

Saludos :krider:

Link to comment
Share on other sites

Despues que termine de ejecutar el while intenta destruir el Datareader (read.dispose) . Hace tiempo no programo en VB, pero recuerdo que para un proyecto que hice para la U en C# tuve un error similar cuando ejecutaba una segunda consulta sobre el mismo y era por que ya existia un objeto datareader.

 

While reader.Read
txtnombre.Text = reader("nombre")
txtapellido.Text = reader("apellido")
End While

 

reader.dispose

Edited by Nearco
Link to comment
Share on other sites

gracias a todos por sus consejos, finalmente segui la idea de SusoDicho , me faltaba abrir y cerrar la coneccion desde el boton y funciona, dejo el codigo por si a alguien mas le sirve

Codigo de mi clase

 Private cn As New MySqlConnection(Cadena)'la variable cadena contiene
                                          ' la cadena de coneccion
    Public Property conectar As MySqlConnection
        Get
            Return cn
        End Get
        Set(ByVal value As MySqlConnection)
            cn = value
        End Set
    End Property


y en el boton buscar

 Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click

        Dim reader As MySqlDataReader
        oDatos.conectar.Open()  'oDatos es el objeto que hace referencia a mi clase
        cmd = oDatos.buscar(txtrut.Text)
        reader = cmd.ExecuteReader
        While reader.Read
            txtnombre.Text = reader("nombre")
            txtapellido.Text = reader("apellido")
        End While
        oDatos.conectar.Close()
    End Sub

y eso seria muchisimas gracias a todos

 

 

favor cerrar nomas =)

Link to comment
Share on other sites

Francamente no creo que sea buena idea dar la posibilidad de acceder directamente al objeto que guarda la conexión a la base de datos. El objeto cn es privado, pero al implementar una propiedad que devuelve una referencia al objeto, estás permitiendo que el usuario haga lo que quiera con él. Deberías implementar métodos como te dije antes, y no una propiedad :no:

Más encima implementaste el Set que permite que el usuario reemplace la conexión. Eso definitivamente está mal. Se supone que tu clase sirve como una capa de abstracción para una conexión a una base de datos, por lo tanto no puedes dejar que el usuario haga lo que quiera con la conexión.

 

Otra cosa, se supone que el nombre de una propiedad no debería ser un verbo (tú la llamaste conectar). El nombre conectar sería más adecuado para un método.

Edited by susodicho
Link to comment
Share on other sites

Entonces crea otro método que sirva para establecer los datos de una conexión :tonto:

O sea, agrega 3 métodos a tu clase (y quita la propiedad conectar):

  • AbrirConexion
  • CerrarConexion
  • CambiarConexion
Este último recibiría como parámetro la dirección del servidor y/o cualquier otra información relevante para establecer la conexión.
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...