none
Almacenar y leer correctamente DataTable almacenados en Session RRS feed

  • Pregunta

  • Buen día expertos, tengo desarrollada una aplicación en asp.net para que los vendedores de la empresa puedan crear cotizaciones a los clientes, está publicada en IIS en un servidor interno.

    En varias partes del programa existen listas desplegables, que son cargadas por ejemplo con una lista de clientes, de artículos, o las diferentes monedas disponibles para cotizar, etc.

    Todas las listas desplegables se cargan a partir de un DataTable, y los DataTable a su vez los lleno con información resultante de consultas a la Base de Datos como en el ejemplo a continuación:

    SqlDataAdapter da = new SqlDataAdapter("SELECT U_Serie, U_Almacen, U_Proyecto FROM TABLE", con);
    
    DataTable dt = new DataTable();
    da.Fill(dt);
    
    //Guardar DT en variable de sesión
    Session.Add("SerieAlmacen", dt);

    Y posteriormente cuando requiero leer algo de ese objeto, lo hago de esta forma:

    try
    {
        string buscar = ddlSerie.SelectedItem.Text.ToString();
    
        //Leer dato desde DT almacenado en sesión
        DataTable dt = Session["SerieAlmacen"] as DataTable;
    
        DataRow[] indice = dt.Select("U_Serie = '" + buscar + "'");
        Session["almacen"] = indice[0]["U_Almacen"].ToString();
        Session["proyecto"] = indice[0]["U_Proyecto"].ToString();
    
        txtAlmacenArticulo.Text = Session["almacen"].ToString();
        txtProyectoArticulo.Text = Session["proyecto"].ToString();
    }
    catch (Exception ex)
    {
        error = "Error al buscar relación serie-almacén-proyecto: " + ex.Message;
        ShowMessage(error, MessageType.Error);
    }

    Cuando un sólo usuario está conectado a la página no tengo ningún problema, pero cuando varios usuarios se conectan de forma simultánea y realizan búsquedas y cargan listas desplegables al mismo tiempo es cuando comienza a aparecerles el siguiente error:

    Object reference not set to an instance of an object

    Mi consulta es si ustedes sabrán decirme qué estoy haciendo mal, si guardar las búsquedas en DataTables y almacenarlas en Session lo estoy haciendo de forma incorrecta, o si esta no es la mejor forma de lograr esto qué otra alternativa me pudieran sugerir.

    Agradezco de antemano cualquier apoyo, ejemplo u orientación que puedan brindarme. Saludos cordiales.

    martes, 31 de julio de 2018 15:12

Respuestas

  • hola

    >>el detalle es que algunas cosas como búsquedas de clientes o artículos no son los mismos para cada usuario,

    eso no se cachea, esas entidades de negocio,debes ir a la db en cada operacion

    o se puede definir un cache temporal, o usando SqlDependency para que expire si algo cambia, sino que lo tome del cache

    esta claro que en el codigo denes poner logica que valide que si un dato no esta en el cache debe ir a buscarlo a la db

    ahora si la entidad es relativamente estatica como monedas, paises, etc esos los pones sin problema

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta LuisVillarreal lunes, 13 de agosto de 2018 18:51
    martes, 31 de julio de 2018 17:34

Todas las respuestas

  • hola

    Estas usando el objeto incorrecto, si es info estatica se usa el Cache

    Almacenar en caché datos de la aplicación

    en ese objeto pones los datos que son fijos para todos los usuario, asi no tienes que ir a la db constantemente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de julio de 2018 16:28
  • Buen día Leandro, gracias por tu respuesta, el detalle es que algunas cosas como búsquedas de clientes o artículos no son los mismos para cada usuario, es decir que si tengo 5 vendedores conectados, cada uno requerirá hacer sus propias consultas y búsquedas, y necesito algún objeto en el que guardar esos resultados, pero tienen que ser independientes para cada sesión, no puedo compartirlos.

    Espero haberme explicado, ojalá puedas apoyarme con este asunto. Muchas gracias!

    martes, 31 de julio de 2018 16:36
  • hola

    >>el detalle es que algunas cosas como búsquedas de clientes o artículos no son los mismos para cada usuario,

    eso no se cachea, esas entidades de negocio,debes ir a la db en cada operacion

    o se puede definir un cache temporal, o usando SqlDependency para que expire si algo cambia, sino que lo tome del cache

    esta claro que en el codigo denes poner logica que valide que si un dato no esta en el cache debe ir a buscarlo a la db

    ahora si la entidad es relativamente estatica como monedas, paises, etc esos los pones sin problema

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta LuisVillarreal lunes, 13 de agosto de 2018 18:51
    martes, 31 de julio de 2018 17:34
  • Buen día Leandro, gracias por tu respuesta y disculpa por demorar tanto en responder.

    Estuve leyendo lo referente a caché que mencionaste en el siguiente enlace:

    Tutorial: Almacenar en caché datos de la aplicación en ASP.NET

    Pero no consigo hacer que funcione, tendrás algún ejemplo que pueda ayudarme a resolver lo de caché temporal que me sugeriste?

    Cómo lo haría para guardarlo en caché en vez de guardarlo en variable de sesión?

    Gracias de antemano por tu tiempo y apoyo en este asunto.

    jueves, 2 de agosto de 2018 14:58
  • hola

    >>Pero no consigo hacer que funcione,

    como validas que no funciona ?

    >>Cómo lo haría para guardarlo en caché en vez de guardarlo en variable de sesión?

    aplica igual que el objeto session, basicamente asocias un key con los datos

    la idea es siemrpe validar si el dato esta en cache y sino esta ir a la db y recuperarlo, por supuesto asignando en el cache para que la proxima consulta se recupere de alli

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 2 de agosto de 2018 16:07

  • eso no se cachea, esas entidades de negocio,debes ir a la db en cada operacion


    Muchas gracias por tu apoyo Leandro, de nuevo una enorme disculpa por la demora en responder.

    Al final si tenías razón que la mejor práctica era la de consultar a la DB en cada operación.

    Un saludo desde México.

    lunes, 13 de agosto de 2018 18:50