none
Reusar DataSet

    Pregunta

  • Buenos Días a todos 

    estoy haciendo un programa que usa huellas para validar el cliente (son 9 equipos trabajando al tiempo) y tengo una duda respectos como puedo reutilizar un dataset para no tener que volver a cargar las huellas ya que son como 3000 y consume "mucha" red 

    tengo el siguiente codigo 

    Capa de Presentación

    Private Sub frm_identificar_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim IdCaja As Integer 'uso temporal IdCaja = 2 'uso temporal txt_id_remision.Text = CStr(NewRemision(IdCaja))

    For Each dataRow As DataRow In HuellasBol.lista_huellas.Tables(0).Rows If Not IsDBNull(dataRow(1)) Then Dim printXML As String = CStr(dataRow(1)) fmdListPrint1.Add(Fmd.DeserializeXml(printXML)) userIdList1.Add(CStr(dataRow(0))) End If If Not IsDBNull(dataRow(2)) Then Dim printXML As String = CStr(dataRow(2)) fmdListPrint2.Add(Fmd.DeserializeXml(printXML)) userIdList2.Add(CStr(dataRow(0))) End If Next Identify() End Sub

    Capa de Negocios 

      Public Function lista_huellas() As DataSet
            Return HuellaDal.lista_huellas()
        End Function

    Capa de Datos

        Public Function lista_huellas() As DataSet
            Dim cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("lavapos_cnn").ToString())
            Dim ds_huellas As New DataSet
            Try
                Dim cmd As New SqlCommand("sp_list_huellas")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cnn
                cnn.Open()
                Dim da_list_fp As New SqlDataAdapter(cmd)
                da_list_fp.Fill(ds_huellas, "huellas")
            Catch ex As Exception
                MsgBox(ex.Message,, "LAVAPOS")
            Finally
                cnn.Close()
                End Try
            Return ds_huellas
        End Function
    me funciona bien pero cada vez que verifico una huella me ejecuta toda la función los cual vuelve a solicitar al servidor todas las huellas por la red y es un poco "demorado" son mas o menos un promedio de 20 a 25 megas que pesa esa tabla de huellas

    Estoy usando el SDK de DigitalPersona y basándome en los ejemplo para realizar el programa

    Muchas Gracias por su colaboración


    Freddy Aragon

    lunes, 16 de enero de 2017 17:04

Respuestas

  • Podrías mantener el dataset cacheado a nivel de capa de datos. Simplemente, saca la variable ds_huellas  a un sitio donde persista (por ejemplo, puedes declararla como estática (Shared) a nivel de clase) e inicialízala a Nothing. Y luego, dentro de lista_huellas() lo primero compruebas si es Nothing, en cuyo caso ejecutas el mismo código que ya tienes para cargarla, y en caso contrario (es decir, si ya está cargada o en otras palabras, si no es Nothing) entonces devuelves el valor que ya tiene la variable sin tener que recargarla desde el servidor.

    Ojo, si tienes alguna otra función en capa de datos que modifique la tabla en el servidor, tienes que acordarte de volver a poner Nothing en la variable para que la siguiente vez se recargue desde el servidor.

    • Marcado como respuesta Freddy Aragon lunes, 16 de enero de 2017 20:13
    lunes, 16 de enero de 2017 18:25
  • Muchas Gracias

    me quedo así 

      

    Sharde ds_huellas as dataset

    Public Function lista_huellas() As DataSet Dim cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("lavapos_cnn").ToString()) If ds_huellas.Tables.Count > 0 Then Return ds_huellas Else Try Dim cmd As New SqlCommand("sp_list_huellas") cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cnn cnn.Open() Dim da_list_fp As New SqlDataAdapter(cmd) da_list_fp.Fill(ds_huellas, "huellas") Catch ex As Exception MsgBox(ex.Message,, "Lavasport LAVAPOS") Finally cnn.Close() End Try Return ds_huellas End If End Function

    y me funciona perfecto :D no se si validar que halla tablas este bien o se hace de otra manera :D


    Freddy Aragon


    lunes, 16 de enero de 2017 20:13

Todas las respuestas

  • Podrías mantener el dataset cacheado a nivel de capa de datos. Simplemente, saca la variable ds_huellas  a un sitio donde persista (por ejemplo, puedes declararla como estática (Shared) a nivel de clase) e inicialízala a Nothing. Y luego, dentro de lista_huellas() lo primero compruebas si es Nothing, en cuyo caso ejecutas el mismo código que ya tienes para cargarla, y en caso contrario (es decir, si ya está cargada o en otras palabras, si no es Nothing) entonces devuelves el valor que ya tiene la variable sin tener que recargarla desde el servidor.

    Ojo, si tienes alguna otra función en capa de datos que modifique la tabla en el servidor, tienes que acordarte de volver a poner Nothing en la variable para que la siguiente vez se recargue desde el servidor.

    • Marcado como respuesta Freddy Aragon lunes, 16 de enero de 2017 20:13
    lunes, 16 de enero de 2017 18:25
  • Muchas Gracias

    me quedo así 

      

    Sharde ds_huellas as dataset

    Public Function lista_huellas() As DataSet Dim cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("lavapos_cnn").ToString()) If ds_huellas.Tables.Count > 0 Then Return ds_huellas Else Try Dim cmd As New SqlCommand("sp_list_huellas") cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cnn cnn.Open() Dim da_list_fp As New SqlDataAdapter(cmd) da_list_fp.Fill(ds_huellas, "huellas") Catch ex As Exception MsgBox(ex.Message,, "Lavasport LAVAPOS") Finally cnn.Close() End Try Return ds_huellas End If End Function

    y me funciona perfecto :D no se si validar que halla tablas este bien o se hace de otra manera :D


    Freddy Aragon


    lunes, 16 de enero de 2017 20:13
  • Lo que me sorprende muchísimo es que te funcione perfecto y que no te dé un error la primera vez que lo llamas. Tal como has declarado ds_huellas, al principio vale Nothing. Por lo tanto, al ejecutar If ds_huellas.Tables.Count > 0 debería dar un error de "Referencia no establecida ...", ya que estás intentando acceder a la colección Tables de un objeto que no contiene nada. La comprobación correcta sería "If Not ds_huellas is Nothing Then ..."

    Otra cosa: Te recomendaría que el Dim cnn... Lo pusieras dentro del "Else" en lugar de ponerlo al principio, para que no se construya inútilmente un SqlConnection que luego no vas a usar para nada si se cumple el If y te sales de la subrutina. También es superfluo el cnn.Open y cnn.Close dado que usas un SqlDataAdapter, que ya hace internamente el Open y el Close de su conexión. Y por otra parte, te falta el Dispose de la conexión. No es demasiado grave omitirlo dado que ya haces un Close, pero es buena práctica hacer siempre el Dispose de las clases que implementan IDisposable.

    lunes, 16 de enero de 2017 20:27
  • La verdad lo intente con nothing y no me funciona me da un error en la capa de presentación

     For Each dataRow As DataRow In HuellasBol.lista_huellas.Tables(0).Rows

    Excepción no controlada del tipo 'System.IndexOutOfRangeException' en System.Data.dll

    Gracias por tus consejos muchas gracias 

    la verdad hace poco estoy con .Net así que estoy aprendiendo voy a investigar lo de dispose;

    pero la pregunta obvia seria cambio el cnn.close() por dispose()?

    Nuevamente gracias


    Freddy Aragon

    lunes, 16 de enero de 2017 21:38
  • Definitivamente no habrá un dataset que permanezca en memoria y que puedan usar los 9 equipo ya que la aplicación corre en el equipo del cliente, para hacer lo que tu pides debes hacer una aplicación WEB para que corra en el servidor y ahora si el dataset en el servidor estará disponible para los 9 equipos.

    Intenta hacer tu desarrollo desde VisualBasic pero WEB, teniendo como servidor el equipo donde tienes tus bases de datos, ese equipo debes de habilitar IIS y publicar hacia el servidor.

    Saludos

    Si la respuesta es correcta marcarla como tal por los que vienen detrás.

    lunes, 16 de enero de 2017 22:29
  • pero la pregunta obvia seria cambio el cnn.close() por dispose()?

    Sí, cámbialo. El Dispose ya hace por dentro un Close en el caso de que la conexión estuviese abierta, y adicionalmente sirve para liberar los recursos no-gestionados que hubieran sido asignados a la conexión.
    lunes, 16 de enero de 2017 22:53
  • Gracias, cada equipo es un cliente que le accede a la base de datos individualmente :D no es lo mismo ademas estánen una red local :D


    Freddy Aragon

    martes, 17 de enero de 2017 13:06