none
la conexion no se cierra RRS feed

  • Pregunta

  • hola que tal tengo el problema que al dar de nuevo clic en el boton guardar del formulario,ya que imagino que un usuario lo haria , este me devuelve el mensaje y cierra la aplicacion de que" la conexion no se ha cerrado y actualmente esta abierta". les dejo el codigo para ver si me pueden orientar con este problema . muchas gracias de antemano.

     

     

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Try

     

                Dim cmd As New SqlCommand

                cmd.Connection = cn

                cn.Open()

                cmd.CommandText = "SELECT nombre FROM usuario WHERE Nombre = @nombre"

                cmd.Parameters.AddWithValue("@nombre", txtnombre.Text)

     

                If Not IsDBNull(cmd.ExecuteScalar) Then

                    MsgBox("El nombre de usuario no está disponible")

                    cn.Close()

                End If

     

            Catch zigma As SqlClient.SqlException

                MessageBox.Show("ya existe ese nombre de usuario")

            End Try

     

            Try

                cn.Open()

     

                Dim cm As New SqlCommand

                cm.Connection = cn

     

                cm.CommandText = "sp_insert_usuario"

                cm.CommandType = CommandType.StoredProcedure

                cm.Parameters.Add("@nombre", SqlDbType.VarChar, 20).Value = txtnombre.Text

                cm.Parameters.Add("@password", SqlDbType.VarChar, 10).Value = TextBox2.Text

                cm.ExecuteNonQuery()

                cn.Close()

                MessageBox.Show("Nuevo usuario registrado")

     

            Catch ex As SqlClient.SqlException

                MessageBox.Show(ex.Message)

            End Try

        End Sub

    miércoles, 19 de octubre de 2011 22:24

Respuestas

  • porque no intentas algo como esto

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    	Try
    
    		If ExisteUsuario() Then
    			MsgBox("El nombre de usuario no está disponible")
    			Return
    		End If
    	
    		Using cn As New SqlConnection("connection string")
    			cn.Open()
    
    			Dim cm As New SqlCommand("sp_insert_usuario", cn)
    			cm.CommandType = CommandType.StoredProcedure
    
    			cm.Parameters.AddWithValue("@nombre",  txtnombre.Text)
    			cm.Parameters.AddWithValue("@password",  TextBox2.Text)
    			
    			cm.ExecuteNonQuery()
    
    			MessageBox.Show("Nuevo usuario registrado")
    			
    		End Using
    
    	Catch ex As SqlClient.SqlException
    		MessageBox.Show(ex.Message)
    	End Try
    
    End Sub
    
    
    Private Function ExisteUsuario() As Boolean
    	
    
    	Using cn As New SqlConnection("connection string")
    		cn.Open()
    		Dim query As String = "SELECT COUNT(*) FROM usuario WHERE Nombre = @nombre"
    		Dim cmd As New SqlCommand(query, cn)
    
    		cmd.Parameters.AddWithValue("@nombre", txtnombre.Text)
    
    		Dim cant As Integer = cmd.ExecuteScalar
    
    		If cant = 0  Then
    			Return False
    		Else
    			Return True
    		End If
    		
    	End Using
    
    		
    End Function
    


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta inbetweener miércoles, 19 de octubre de 2011 23:11
    miércoles, 19 de octubre de 2011 22:48

Todas las respuestas

  • Pues asegurate que siempre se cierre la coneccion

     Dim cn As SqlConnection
            Try
                cn = New SqlConnection()
                cn.Open()
    
                .....
            Catch ex As Exception
    	.......
            Finally
                If cn IsNot Nothing Then
                    cn.Close()
                End If
            End Try
    

    agregale la sentencia Finally y ahi es donde cierras la coneccion

    Saludos

    Giancarlo Rolando Huarcaya Martinez

     

     


    giancarlo
    miércoles, 19 de octubre de 2011 22:36
  • donde defines a cn ? porque deberia esta alli mismo local en el metodo
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 19 de octubre de 2011 22:42
  • Buenas inbetweener.

    Una buena práctica es realizar el cierre de la conexión en el Finally del Try Catch, para asegurarte de que, aunque salte una excepción, finalmente se ejecute el cierre.

    Try
    
    Catch
    
    Finally
         If (Not IsNothing(cn)) Then
              cn.Close()
              cn= Nothing
         End If
    End Try
    

    Recuerda que deberás declarar cn fuera del Try para poder acceder a este desde el Finally.

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    miércoles, 19 de octubre de 2011 22:42
  • Hola te diría que le hagas un seguimiento paso a paso para ver en donde está saliendo sin cerrar la conexion.

     

    Por otro lado esta línea : If Not IsDBNull(cmd.ExecuteScalar) Then

    En esa lína si entra se cierra la conexión, caso contrario sigue y la conexion continua abierta y pasa al otro try.

    Ahi debe estar el problema.

    Saludos,


    Mariano Llarin.-
    miércoles, 19 de octubre de 2011 22:43
  • porque no intentas algo como esto

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    	Try
    
    		If ExisteUsuario() Then
    			MsgBox("El nombre de usuario no está disponible")
    			Return
    		End If
    	
    		Using cn As New SqlConnection("connection string")
    			cn.Open()
    
    			Dim cm As New SqlCommand("sp_insert_usuario", cn)
    			cm.CommandType = CommandType.StoredProcedure
    
    			cm.Parameters.AddWithValue("@nombre",  txtnombre.Text)
    			cm.Parameters.AddWithValue("@password",  TextBox2.Text)
    			
    			cm.ExecuteNonQuery()
    
    			MessageBox.Show("Nuevo usuario registrado")
    			
    		End Using
    
    	Catch ex As SqlClient.SqlException
    		MessageBox.Show(ex.Message)
    	End Try
    
    End Sub
    
    
    Private Function ExisteUsuario() As Boolean
    	
    
    	Using cn As New SqlConnection("connection string")
    		cn.Open()
    		Dim query As String = "SELECT COUNT(*) FROM usuario WHERE Nombre = @nombre"
    		Dim cmd As New SqlCommand(query, cn)
    
    		cmd.Parameters.AddWithValue("@nombre", txtnombre.Text)
    
    		Dim cant As Integer = cmd.ExecuteScalar
    
    		If cant = 0  Then
    			Return False
    		Else
    			Return True
    		End If
    		
    	End Using
    
    		
    End Function
    


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta inbetweener miércoles, 19 de octubre de 2011 23:11
    miércoles, 19 de octubre de 2011 22:48
  • muchas gracias a todos y disculpas si pregunto acerca de cosas que para uds deben de ser faciles soy relativamente nuevo como desarrollador .

    gracias a todos .

    miércoles, 19 de octubre de 2011 23:13