none
Hay un datareader abierto RRS feed

  • Pregunta

  • Amigos buenas tardes ,  requiero de su ayuda soy muy nuevo en este tema de ado.net , resulta que tengo un TableAdapter y este me trae una consulta de la base de datos  , esta funciona correctamente. pero resulta que me dio por hacer unas pruebas y ejecute la consulta con varios usuario al tiempo  y esta inmediatamente me saca error , me dice que ya hay un dataReader abierto  , estoy intentado abrir y cerrar conexión del método donde  utilizo el adapter pero no se bien como hacerlo , será que me pueden guiar para solucionar este error. les comparto mi código 

      private static ReimprimirRemisionesTableAdapter datpR = new ReimprimirRemisionesTableAdapter();

      public static DsRemision.ReimprimirRemisionesDataTable BusquedaRImprimir(string Remision)
            {
                SqlTransaction Tran = null;
                SqlConnection con = null;
                try
                {
                    con = new SqlConnection("Data Source =.; Initial Catalog =Prueba; Integrated Security = True; MultipleActiveResultSets = true");
                    con.Open();
                    datpR.Connection = con;
                    Tran = con.BeginTransaction();
                    datpR.Transaction = Tran;
               

                }
                catch (Exception)
                {
                    Tran.Rollback();
                }


                return datpR.GetRimprimir(Remision);
                con.Close(); aca me marcha error al cerrar , medice  Código inaccesible detectado
               
            }


    Daniel

    martes, 13 de octubre de 2020 19:40

Todas las respuestas

  • Fíjate en las dos últimas líneas. Primero devuelves el datareader al llamante de la subrutina. Y después intentas cerrarlo. En primer lugar, no puedes poner ese Close ahí, porque nunca se llega a ejecutar esa línea; la sentencia return abandona la ejecución de la subrutina y todo lo que haya debajo es "inalcanzable" como te dice el mensaje de error, es decir nunca se puede ejecutar.

    Entonces, ¿dónde poner el Close? ¿Antes del return? Tampoco. Si cerrases ahí la conexión, entonces se volvería inutilizable el datareader que le estás intentando devolver al llamante de la subrutina, y ese datareader no le serviría para nada.

    Entonces, ¿Cuál es la solución? Pues cambiar el diseño de estructura de programa que has hecho. El DataReader no se brinda a ser obtenido en una subrutina que lo devuelva a un llamante y a la vez garantizar que se cierra correctamente. Si quieres devolver datos desde la subrutina, escribe una subrutina que abra la conexión, abra el datareader, cargue los datos en un objeto en memoria, cierre el datareader, cierre la conexión, y devuelva ese objeto cargado de datos. Y recuerda que si ese "objeto cargado de datos" te vale con que sea un DataTable, entonces puedes cargarlo con un DataAdapter que solo require una línea de código porque el DataAdapter ya sabe internamente abrir y cerrar la conexión y abrir y cerrar un datareader y usarlo para cargar el datatable.

    • Propuesto como respuesta Óscar Navarro martes, 13 de octubre de 2020 21:04
    martes, 13 de octubre de 2020 20:28
  • Tienes alguna actualización sobre tu consulta?

    Saludos


    viernes, 16 de octubre de 2020 17:52