bombero_7 Posted December 27, 2013 Report Share Posted December 27, 2013 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 NullReferenceExceptionreferencia 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 More sharing options...
susodicho Posted December 27, 2013 Report Share Posted December 27, 2013 (edited) 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 FunctionPrivate 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 December 27, 2013 by susodicho Link to comment Share on other sites More sharing options...
AshWilliams Posted December 27, 2013 Report Share Posted December 27, 2013 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 More sharing options...
Nearco Posted December 27, 2013 Report Share Posted December 27, 2013 (edited) 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.Readtxtnombre.Text = reader("nombre")txtapellido.Text = reader("apellido")End While reader.dispose Edited December 27, 2013 by Nearco Link to comment Share on other sites More sharing options...
bombero_7 Posted December 27, 2013 Author Report Share Posted December 27, 2013 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 More sharing options...
susodicho Posted December 27, 2013 Report Share Posted December 27, 2013 (edited) 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 December 27, 2013 by susodicho Link to comment Share on other sites More sharing options...
bombero_7 Posted December 28, 2013 Author Report Share Posted December 28, 2013 es que el tema que se pueda modificar la coneccion es que la aplicacion tiene un archivo en el cual es posible modificar la coneccion ya que se puede conectar a diferentes servidores, por ende el usuario podra modificar la direccion a donde se conecta Link to comment Share on other sites More sharing options...
susodicho Posted December 28, 2013 Report Share Posted December 28, 2013 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):AbrirConexionCerrarConexionCambiarConexionEste ú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 More sharing options...
cañangasñangas Posted December 28, 2013 Report Share Posted December 28, 2013 cerrado a peticion... Link to comment Share on other sites More sharing options...
Recommended Posts