none
Conexion cerrada RRS feed

  • Pregunta

  • Saludos, quisiera pedir de favor me ayuden con un problemita, tengo una base de datos sql server y una app desarrollada en vb.net que se pega remotamente a la BD, hay un modulo que realiza una consulta por medio de un while, el problema se da cuando esa consulta devuelve muchos datos, a media consulta la conexión se cierra y el programa se detiene, creo que tiene que ver con alguna configuración de sql server, pero no se cual, si alguien me puede ayudar con eso le estaría muy agradecido, de antemano gracias.
    jueves, 1 de junio de 2017 13:38

Respuestas

  • Gracias a todos por sus comentarios, el problemas era cuestión de optimizar la consulta, ya que aunque cambiara el timeout siempre pasaba los mismo. Era error de estructura de las instrucciones.
    jueves, 1 de junio de 2017 21:49

Todas las respuestas

  • Hola Luis ECC

    Probablemente en el command de tu conexión no le estés configurando un timeout apropiado, al ser un while supongo que irá a la base de datos varias veces, debes asegurarte abrir y cerrar conexión en cada llamada y/o darle un timeout al comando:

    Command TimeOut

    //100 segundos, por ejemplo:
    command.CommandTimeout = 100
    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    jueves, 1 de junio de 2017 13:55
  • ¿Obtienes alguna excepción? ¿cuál? ¿podrías mostrar o dar detalles de las operaciones que se desarrollan en la iteración?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 1 de junio de 2017 15:10
  • Pues este es el código

     Private Sub revisar(mes As String, anho As String, cond As String)
            Dim t As String()
            Dim d As Data = New Data()
            Dim i As Mantenimiento = New Mantenimiento()
            Dim carnet, nombre, grado, id_grado, fecha, monle, beca, cuo As String
            Dim monto, recargo, descuento, total As Decimal
            fecha = cmbFecha.Text
            i.EliminarTodo("facturas")
            Dim x As SqlDataReader = d.Buscar("SELECT cobros.carnet, cobros.apellidos, cobros.nombres, cobros.grado, cobros.matricula, cobros.cuota, grado.id_grado FROM Cobros INNER JOIN grado ON cobros.grado = grado.grado WHERE " & cond & " AND anho = " & anho & " ")
            While (x.Read())
                carnet = x.GetString(0)
                nombre = x.GetString(1) & ", " & x.GetString(2)
                grado = x.GetString(3)
                monto = x.GetDecimal(5)
                id_grado = x.GetString(6)
                beca = ""
                cuo = 0
                descuento = 0
                total = 0
                recargo = 5
                Dim tot As Decimal = monto + 5
                If InStr(1, tot, ".", CompareMethod.Text) = 0 Then
                    monle = Num2Text(tot) & " DOLARES"
                Else
                    t = Split(tot, ".")
                    If t(1).Length = 1 Then
                        monle = Num2Text(t(0)) & " CON " & t(1) & "0" & "/100 DOLARES"
                    Else
                        monle = Num2Text(t(0)) & " CON " & t(1) & "/100 DOLARES"
                    End If
                End If

                Dim cuota As SqlDataReader = d.Buscar("SELECT cuota FROM cuotas WHERE tipo = 'C' and id_grado = '" & id_grado & "' ")
                cuota.Read()
                cuo = CDec(cuota.GetString(0))
                If monto < cuo Then
                    beca = "(-) descuento por beca"
                    descuento = cuo - monto
                    total = cuo - descuento + recargo
                    monto = cuo
                    i.Agregar("facturas", "'" & carnet & "','" & nombre & "', '" & grado & "','" & fecha & "','" & mes & "', " & monto & ", " & recargo & ", " & descuento & ", " & total & ",'" & monle & "', '" & beca & "'")
                Else
                    total = cuo + recargo
                    i.Agregar("facturas", "'" & carnet & "','" & nombre & "', '" & grado & "','" & fecha & "','" & mes & "', " & monto & ", " & recargo & ", null, " & total & ",'" & monle & "', '" & beca & "'")
                End If
            End While

    jueves, 1 de junio de 2017 16:09
  • Olvidaste adjuntar la excepción que obtienes, de hecho noto algunas conversiones raras y la ejecución de consultas donde agregas los argumentos como parte de la cadena que contiene la consulta sql, lo cual no es correcto. Por otro lado, imagino que tienes configurado el atributo MARS para poder iterar por un cursor anidado, ¿verdad?

    Sin embargo, creo que es innecesario el cursor anidado cuando puedes combinar la segunda consulta junto con la primera, ¿la tabla cuotas se encuentra en la misma base de datos o la misma instancia que las tablas Cobros y Grado?

    Agrega un manejador de errores TRY-CATCH para obtener el mensaje de la excepción entre otros recursos para dar con el origen del error.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 1 de junio de 2017 16:35
  • ExecuteNonQuery requiere una Connection abierta y disponible. El estado actual de la conexión es cerrada.
    jueves, 1 de junio de 2017 17:29
  • No es ese el problema, ya que al hacer la consulta, si esta devuelve ejemplo 100 registros poco mas poco menos, se ejecuta con normalidad, el problemas es cuando debe mostrar más, después de un tiempo la app se detiene porque la conexión se cierra, es cuando da la excepción.
    jueves, 1 de junio de 2017 18:13
  • Debes verificar la conectividad que estas utilizando y si tienes el MDAC correspondiente o actualizado para la version de SQL server. Puedes intentar crear otro tipo de configuración de conexión.  ADO.net

    Saludos

    jueves, 1 de junio de 2017 20:20
  • Gracias a todos por sus comentarios, el problemas era cuestión de optimizar la consulta, ya que aunque cambiara el timeout siempre pasaba los mismo. Era error de estructura de las instrucciones.
    jueves, 1 de junio de 2017 21:49
  • No respondiste la pregunta: ¿la tabla cuotas se encuentra en la misma base de datos o la misma instancia que las tablas Cobros y Grado?, de hecho si se encuentra en la misma base de datos te evitas la consulta anidada porque podrías obtener las columnas mediante combinación.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 1 de junio de 2017 22:09