none
Navegacion en el modo conectado RRS feed

  • Pregunta

  • Buenas noches:

    Estoy aprendiendo ADO .NET y he visto algunos libros. Hablan de modo conectado y modo desconectado y parece que uno puede elegir una u otra opción y que ambas están igualmente capacitadas. El modo desconectado se describe como idóneo para app con muchos clientes accediendo a la vez y el modo conectado cuando el número de usuarios es medio y previsible. Este último tiene la ventaja de que bloquea los registros y evita modificaciones concurrentes.

    Sin embargo cuando creo una aplicación en el modelo conectado veo grandes limitaciones para navegar. De hecho, lo único que se me ocurre es lo que expongo a continuación, lo que me parece muy ineficiente y cutre (el ir hacia atrás). Si hay muchos registros creo que será muy lento:

    Declaro a nivel de clase:

    Dim midatareader As OracleDataReader
        Dim num As Integer
        'num es la variable que almacena el número de registros leídos
     
    Luego creo dos botones adelante y atrás para navegar por los registros de la tabla:

    Private Sub Adelante(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
                If midatareader.Read Then
                    Me.TextBox1.Text = midatareader.Item(0).ToString
                    Me.TextBox4.Text = midatareader.Item(1).ToString
                    num += 1
                Else
                    MessageBox.Show("Ya no hay mas registros")
                End If
    End Sub



        Private Sub Atrás(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            midatareader.Close()
            midatareader = comando2.ExecuteReader
            If num <> 0 Then
                For i = 0 To num - 1
                    midatareader.Read()
                Next
                Me.TextBox1.Text = midatareader.Item(0).ToString
                Me.TextBox4.Text = midatareader.Item(1).ToString
                num -= 1
            Else
                MessageBox.Show("Este es el primer registro. No se puede retroceder mas")
            End If
        End Sub

    ¿Alguien me puede decir si hay una manera más eficiente de navegar?. ¿O es que realmente el modo conectado es muy limitado en cuanto a su uso?.

    Muchas gracias


    lunes, 15 de febrero de 2010 23:43

Respuestas

  • No, el DataReader no está pensado para utilizarlo de esa forma.

    Si quieres ir mostrando registros para adelante y para atrás, una forma de hacerlo es dar una única pasada con el datareader cargando todos los datos dentro de una estructura en memoria, y a continuación hacer que los botones muestren registros de esa estructura. Por cierto, esto precisamente es lo que hace internamente el DataAdapter cuando carga los datos en un DataTable (lo que se suele llamar modo desconectado), así que como ves, en realidad no hay mucha diferencia entre el modo conectado y el desconectado en este caso.

    Otra alternativa es enviar una consulta al servidor cada vez que se pulsa un botón de avance y retroceso. Por ejemplo, para el avance se enviaría una consulta del tipo "Select TOP 1 losCampos from LaTabla where CampoClave>ElUltimoValorQueHemosCargado Order By CampoClave", y para el retroceso una consulta similar pero con "<" en lugar de ">" y "DESC" en el "order by". Por supuesto, añadiendo las comprobaciones oportunas para el caso de que estemos al principio o al final de los datos. Esta modalidad envía más consultas al servidor, pero tiene la ventaja de que nunca se llegan a acargar todos los registros en memoria, por lo que se podría usar aunque la tabla tuviese millones de registros.
    • Marcado como respuesta Gabrach miércoles, 17 de febrero de 2010 21:06
    miércoles, 17 de febrero de 2010 15:47

Todas las respuestas

  • No, el DataReader no está pensado para utilizarlo de esa forma.

    Si quieres ir mostrando registros para adelante y para atrás, una forma de hacerlo es dar una única pasada con el datareader cargando todos los datos dentro de una estructura en memoria, y a continuación hacer que los botones muestren registros de esa estructura. Por cierto, esto precisamente es lo que hace internamente el DataAdapter cuando carga los datos en un DataTable (lo que se suele llamar modo desconectado), así que como ves, en realidad no hay mucha diferencia entre el modo conectado y el desconectado en este caso.

    Otra alternativa es enviar una consulta al servidor cada vez que se pulsa un botón de avance y retroceso. Por ejemplo, para el avance se enviaría una consulta del tipo "Select TOP 1 losCampos from LaTabla where CampoClave>ElUltimoValorQueHemosCargado Order By CampoClave", y para el retroceso una consulta similar pero con "<" en lugar de ">" y "DESC" en el "order by". Por supuesto, añadiendo las comprobaciones oportunas para el caso de que estemos al principio o al final de los datos. Esta modalidad envía más consultas al servidor, pero tiene la ventaja de que nunca se llegan a acargar todos los registros en memoria, por lo que se podría usar aunque la tabla tuviese millones de registros.
    • Marcado como respuesta Gabrach miércoles, 17 de febrero de 2010 21:06
    miércoles, 17 de febrero de 2010 15:47
  • Muchas gracias Alberto. Tu experiencia me da otro punto de vista del tema. 

    Realmente ahora, ¿se hacen aplicaciones en modo conectado o ya prácticamente todas son en modo desconectado?.

    Un cordial saludo
    miércoles, 17 de febrero de 2010 21:05
  • Verdaderamente, los dos modos no son distintos. En el modo que se llama "desconectado", lo que ocurre es que se guardan los datos dentro de un DataSet y se leen y graban mediante DataAdapters. Pero los DataAdapters internamente funcionan en modo "conectado". Es decir, abren conexión, y usan objetos Command para comunicarse con el servidor, que al fin y al cabo es lo que haces cuando manejas el modo "conectado" manualmente. Por lo tanto, no hay diferencia real entre ambos. En los dos modos, se abre conexión al servidor, se envían o reciben datos, y se cierra la conexión.

    En la práctica, las aplicaciones con frecuancia son "mixtas", es decir, algunos datos se guardan en memoria dentro de un DataSet, cuando resulta conveniente, y otros datos se trasvasan explícitamente mediante objetos SqlCommand y SqlDataReader. Incluso en el caso en que se usan estos últimos, se abre la conexión en el momento en que se necesita, se realiza la operación, y se cierra la conexión inmediatamente. Y si la conexión se necesita de nuevo acto seguido, se vualve a abrir y cerrar. El Pool de conexiones gestiona estas operaciones de apertura y cierre para que no sean costosas. Por tanto, incluso cuando se está en modo "conectado", la conexión permanece cerrada la mayor parte del tiempo, y solo se abre momentáneamente cuando se necesita enviar una sentencia al servidor. Es decir, exactamente lo mismo que ocurre en el modo "desconectado", por lo que ambos son equivalentes y se pueden mezclar sin problemas dentro del mismo programa.

    miércoles, 17 de febrero de 2010 21:52