none
Cierre de Conexion a sql RRS feed

  • Pregunta

  • Hola tengo a continuación de mi inquietud pongo el codigo que uso para realizar la conexion y las cuatros funciones basicas en SQL pero la pregunta es esta: la funcion SqlDetSalidas la uso para conseguir los datos, en el Finally del try cierro la conexion, luego que trato de hacer otra funcion sql (insert, update, delete), me envia error diciendo que la conexion esta cerrada. alguien me puede decir que estoy haciendo mal y si esta forma en que lo hago esta bien?, gracias.

        Public Function SqlDetSalidas(ByVal s_Sqlconn As String, Optional ByRef s_Id As String = "", _
        Optional ByRef s_No_Doc As String = "", Optional ByRef s_Codigo As String = "", _
        Optional ByRef n_Cantidad As Integer = 0, Optional ByRef n_Exp As Integer = 0, _
        Optional ByRef s_Dosis As String = "", Optional ByRef s_Mes As String = "", _
        Optional ByRef s_Fecha As String = "", Optional ByRef s_Id_Entidad As String = "") As SqlDataAdapter
            Dim  SqlConn As New SqlConnection
            Dim Sqlda As New SqlDataAdapter
            Dim SqlCmd1, SqlCmd2, SqlCmd3 As New SqlCommand

            Try
                SqlConn = ConexionSql(s_Sqlconn)
                If SqlConn.State = ConnectionState.Closed Then
                    SqlConn.Open()
                End If

                SqlCmd1.Connection = SqlConn
                SqlCmd1.CommandType = CommandType.StoredProcedure
                SqlCmd1.CommandText = "GET_CF13_1"
                SqlCmd1.Parameters.Add("@No_Doc", SqlDbType.VarChar).Value = s_No_Doc
                SqlCmd1.Parameters.Add("@Id_Entidad", SqlDbType.VarChar).Value = s_Id_Entidad
                Sqlda.SelectCommand = SqlCmd1

                'No_Doc, Codigo, Cantidad, N_Exp, Dosis, Mes, Fecha, Id_Entidad
                SqlCmd2.Connection = SqlConn
                SqlCmd2.CommandType = CommandType.StoredProcedure
                SqlCmd2.CommandText = "INS_CF13_1"
                SqlCmd2.Parameters.Add("@No_Doc", SqlDbType.VarChar).Value = s_No_Doc
                SqlCmd2.Parameters.Add("@Codigo", SqlDbType.VarChar).Value = s_Codigo
                SqlCmd2.Parameters.Add("@Cantidad", SqlDbType.Int).Value = n_Cantidad
                SqlCmd2.Parameters.Add("@N_Exp", SqlDbType.Int).Value = n_Exp
                SqlCmd2.Parameters.Add("@Dosis", SqlDbType.VarChar).Value = s_Dosis
                SqlCmd2.Parameters.Add("@Mes", SqlDbType.VarChar).Value = s_Mes
                If s_Fecha = "//" Or s_Fecha = "__/__/____" Or s_Fecha = "__/____" Or s_Fecha = "" Then
                    SqlCmd2.Parameters.Add("@Fecha", SqlDbType.DateTime).Value = DBNull.Value
                Else
                    SqlCmd2.Parameters.Add("@Fecha", SqlDbType.DateTime).Value = s_Fecha
                End If
                SqlCmd2.Parameters.Add("@Id_Entidad", SqlDbType.VarChar).Value = s_Id_Entidad
                Sqlda.InsertCommand = SqlCmd2

                SqlCmd3.Connection = SqlConn
                SqlCmd3.CommandType = CommandType.StoredProcedure
                SqlCmd3.CommandText = "DEL_CF13_1"
                SqlCmd3.Parameters.Add("@Id", SqlDbType.VarChar).Value = s_Id
                SqlCmd3.Parameters.Add("@Id_Entidad", SqlDbType.VarChar).Value = s_Id_Entidad
                Sqlda.DeleteCommand = SqlCmd3
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical, _
                My.Application.Info.ProductName)
            Finally
                SqlConn.Close()
            End Try

            Return Sqlda
        End Function

    martes, 13 de septiembre de 2016 5:32

Respuestas

  • "JavierJCCH" escribió:

    > ... me envia error diciendo que la conexion esta cerrada
    > alguien me puede decir que estoy haciendo mal ...

    Hola, Javier:

    ¿Dónde obtienes ese error? ¿En la función SqlDetSalidas o en cualquier otro procedimiento donde intentas ejecutar alguna consulta SQL?

    Si la conexión está cerrada, digo yo que tendrás que abrirla para ejecutar una consulta SQL de acción, con independencia que la cierres o no en la función SqlDetSalidas.

    > ... y si esta forma en que lo hago esta bien?

    Ya que lo preguntas, con el debido respeto te responderé que yo, personalmente, me olvidaría inmediatamente de la función SqlDetSalidas que has publicado, al menos del código fuente que aparece en la misma, porque no tiene ningún sentido implementar una función para devolver un objeto SqlDataAdapter que posteriormente utilizaras en algún otro lugar de tu proyecto.

    Eso por un lado, y por otro, fíjate lo que estás haciendo:

    >   Dim SqlConn As New SqlConnection

    ¿Eres consciente de lo que hace esa línea? Si en la declaración de la variable (Dim) utilizas el operador New, estás creando una NUEVA INSTANCIA de la clase SqlConnection a la vez que declaras la variable 'SqlConn'.

    Después supuestamente referencias otro objeto SqlConnection como resultado devuelto por una función llamada "ConexionSql":

    >    SqlConn = ConexionSql(s_Sqlconn)

    ¿Para qué creas una nueva instancia de la clase SqlConnection (con el operador New) si ésta la puedes obtener de la función ConexionSql?

       
    Dim SqlConn As SqlConnection = ConexionSql(s_Sqlconn)

    Si tu intención es rellenar un objeto DataTable como resultado de ejecutar una consulta de selección existente en algún objeto DataTable, lo que tienes que hacer es implementar una función que de acuerdo al objeto SqlCommand que se le pase devuelva un objeto DataTable. Y eso es exactamente lo que hace la función GetData que encontrarás en una respuesta mía que aparece en la siguiente conversación:

    Actualizar una tabla en SQLServer con DataGridView

    Estudia el código fuente del módulo HelperDataAccess y adáptalo a tus necesidades.

    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.

    martes, 13 de septiembre de 2016 9:09
    Moderador

Todas las respuestas

  • Por cierto, se me olvidaba decir que si quito el SqlConn.Close() del finally SI puedo usar esta funcion, que simulo un SqlDataAdapter, todo el tiempo que quiera, supongo que al cerrar el formulario se cierra la conexion... no se, espero sus repuestas Gracias.
    martes, 13 de septiembre de 2016 5:36
  • "JavierJCCH" escribió:

    > ... me envia error diciendo que la conexion esta cerrada
    > alguien me puede decir que estoy haciendo mal ...

    Hola, Javier:

    ¿Dónde obtienes ese error? ¿En la función SqlDetSalidas o en cualquier otro procedimiento donde intentas ejecutar alguna consulta SQL?

    Si la conexión está cerrada, digo yo que tendrás que abrirla para ejecutar una consulta SQL de acción, con independencia que la cierres o no en la función SqlDetSalidas.

    > ... y si esta forma en que lo hago esta bien?

    Ya que lo preguntas, con el debido respeto te responderé que yo, personalmente, me olvidaría inmediatamente de la función SqlDetSalidas que has publicado, al menos del código fuente que aparece en la misma, porque no tiene ningún sentido implementar una función para devolver un objeto SqlDataAdapter que posteriormente utilizaras en algún otro lugar de tu proyecto.

    Eso por un lado, y por otro, fíjate lo que estás haciendo:

    >   Dim SqlConn As New SqlConnection

    ¿Eres consciente de lo que hace esa línea? Si en la declaración de la variable (Dim) utilizas el operador New, estás creando una NUEVA INSTANCIA de la clase SqlConnection a la vez que declaras la variable 'SqlConn'.

    Después supuestamente referencias otro objeto SqlConnection como resultado devuelto por una función llamada "ConexionSql":

    >    SqlConn = ConexionSql(s_Sqlconn)

    ¿Para qué creas una nueva instancia de la clase SqlConnection (con el operador New) si ésta la puedes obtener de la función ConexionSql?

       
    Dim SqlConn As SqlConnection = ConexionSql(s_Sqlconn)

    Si tu intención es rellenar un objeto DataTable como resultado de ejecutar una consulta de selección existente en algún objeto DataTable, lo que tienes que hacer es implementar una función que de acuerdo al objeto SqlCommand que se le pase devuelva un objeto DataTable. Y eso es exactamente lo que hace la función GetData que encontrarás en una respuesta mía que aparece en la siguiente conversación:

    Actualizar una tabla en SQLServer con DataGridView

    Estudia el código fuente del módulo HelperDataAccess y adáptalo a tus necesidades.

    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.

    martes, 13 de septiembre de 2016 9:09
    Moderador