none
Referencia a objeto nula RRS feed

  • Pregunta

  • Buenas , tengo un problema relacionado con el acceso a un objeto (lista de precios ) cuando hay mas de un usuario utilizando la aplicación Web. A ver si me entienden :

    Un usuario ingresa a la aplicación y selecciona unos parametros de busqueda y se crea un dropdownlist con los items a ver, cada vez que el usuario selecciona un items se visualiza su resultado en pantalla, y asi sucesivamente con cada uno que desee ver.

    Ahora, cuando otro usuario ingresa y selecciona otros parametros de busqueda realiza toda sus acciones correctamente, sin embargo el usuario anterior si quiere seguir viendo los items me genera la Excepcion de Referencia Nula al objeto... Es como si se reescribiera en el mismo objeto en vez de tratar por separado  el objeto que usa el usuario 1 y el del usuario 2 ... ayuda por favor, no tengo ni la menor idea de como solucionar esto, gracias....

    lunes, 28 de mayo de 2012 21:13

Respuestas

  • buen podemos observar que hay uan gran cantidad de variable static

            public static DataSet tablasResulRelacion;
            public ReportesPDF reporte;
            public static string rutaDeArchivoExcel, rutaFisicaAplicacion, rutaDeArchivoPDF, nombreArchivo, rutaArchNuevo;
            public static string nombreArchivoRenombrado;

    las cuales recomendaria quitar ese static inmediatamente porque si requieres de este es porque algo esta mal programado

    lo que me preguntoe s porque has mezclado static si despues hay lugares donde usas

    sessionUsuarioOFP.Text = Session["Usuario"].ToString();

    o sea la Session la conoces, porque no la usas quizas para el tablasResulRelacion ponerlo en Session tambien si es que encesitas conservar los datos entre request

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 29 de mayo de 2012 2:17

Todas las respuestas

  • Sin ver código es imposible, pero estoy asumiendo que usted utiliza variables estáticas o bien otra forma de almacenamiento de estado que es común a todos los usuarios.

    Cuando se crea una aplicación ASP.net uno debe tener en cuenta que la aplicación correrá para múltiples usuarios y por lo tanto debe evitar a toda costa el uso de estos recursos compartidos, a menos claro que sea exactamente lo que usted quiere.

    En general, los tutoriales introductorios de ASP.net nos enseñan a que cada usuario tiene una sesión asignada, y que el objeto Session puede almacenar datos que serán independientes para cada usuario.  Yo diría que usted no está haciendo esto y por eso tiene el problema que describe.

    Espero que esto le sirva para encontrar su error.  Si no es así, entonces deberá describir en más detalle y con código su panorama.


    Jose R. MCP

    martes, 29 de mayo de 2012 0:21
    Moderador
  • cuando otro usuario ingresa y selecciona otros parametros de busqueda realiza toda sus acciones correctamente, sin embargo el usuario anterior si quiere seguir viendo los items me genera la Excepcion de Referencia Nula al objeto

    es raro lo del "Referencia Nula2, proque si se tratara de una variable static o shared (si es vb.net) ambos deberian ver los mismo datos

    y no que el segundo recibe un null en un error

    como es el codigo de busqueda que implementas

    donde asignas la informacion del filtro que usas en la query?


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 29 de mayo de 2012 0:28
  • Gracias por su tiempo en responder, este es el código.... El usuario carga un archivo al servidor para su lectura y consulta con varias bases de datos, la cuestion es que cuando varios usuarios la utilizan se renombran los datos obtenidos en el dataset  unos con los otros, y como la lista del dropdownlist puede variar segun lo cargado por el usuario crea esa excepcion a querer seleccionar un items que en su valor fue renombrado por otro... se que es algo confuso y les agradezco mucho su ayuda.....

    public partial class ReportePrecios : System.Web.UI.Page

        {
            public static DataSet tablasResulRelacion;
            public ReportesPDF reporte;
            public static string rutaDeArchivoExcel, rutaFisicaAplicacion, rutaDeArchivoPDF, nombreArchivo, rutaArchNuevo;
            public static string nombreArchivoRenombrado; 

            protected void Page_Load(object sender, EventArgs e)
            {

                if (!Page.IsPostBack)
                {
                    if (Session["Usuario"] != null)
                    {
                        sessionUsuarioOFP.Text = Session["Usuario"].ToString();
                        rutaFisicaAplicacion = Request.PhysicalApplicationPath;
                        nombreArchivoRenombrado = "ListaPrecios_" + Request.Cookies["InfoUsuario"]["Id"] + "_" + Request.Cookies["InfoUsuario"]["Ubicacion"] + ".txt";
                    }
                    else
                    {
                        Response.Redirect("~/Login.aspx");
                    }
                }


            }

            protected void Consultar_Click(object sender, EventArgs e)
            {

                //Se ejecuta este código para vaciar el DROPDOWNLIST, en caso que no sea la primera vez que se carga:
                /*int numItems = listaSucursales.Items.Count;
                if(numItems > 0)
                for (int n = 0; n < numItems; n++)
                listaSucursales.Items.Remove(listaSucursales.Items.FindByValue(Convert.ToString(n)));
                 */
                if (File.Exists(rutaArchNuevo))
                {
                        int numItems = listaSucursales.Items.Count;
                        if (numItems > 0)
                            for (int n = 0; n < numItems; n++)
                                listaSucursales.Items.Remove(listaSucursales.Items.FindByValue(Convert.ToString(n)));

    //ESTE ES EL OBJETO PRINCIPAL YA QUE ME DA EL RESULTADO DE LA BUSQUEDA

                        ResultadoRelacion result = new ResultadoRelacion(Convert.ToString(DropDownList1.SelectedValue), rutaFisicaAplicacion, nombreArchivoRenombrado);
     result.CrearRelacion();

    //SE ASIGNA EL RESULTADO A UN DATASET STATIC PARA VISUALIZAR CADA SUCURSAL SEGUN SE SELECCIONE EN EL //DROPDOWNLIST

                      tablasResulRelacion = result.obtenerDataSetResultRelacion();
                        for (int i = 0; i < tablasResulRelacion.Tables.Count; i++) //Llena el dropdownlist con el nombre de las sucursales
                        {
                            System.Web.UI.WebControls.ListItem itemsSucursal = new System.Web.UI.WebControls.ListItem(Convert.ToString(tablasResulRelacion.Tables[i].TableName), Convert.ToString(i));
                            listaSucursales.Items.Add(itemsSucursal);
                        }
                        listaSucursales.Visible = true;
                        ReportePDF.Visible = true;
                        Label6.Visible = true;
                        File.Delete(rutaArchNuevo); //Despues de cargar todo elimina el archivo cargado por el usuario
                    

                    
                }
                else
                {

                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    sb.Append(@"<script language='javascript'>");
                    sb.Append(@"alert('Tiene que cargar nuevamente el archivo')");
                    sb.Append(@"</script>");
                    ClientScript.RegisterStartupScript(this.GetType(), "Advertencia2", sb.ToString());
                }
                infoArchivo.Text = "";

            }
            //Conforme se selecciona una suscursal de la lista se imprime en pantalla
            protected void listaSucursales_SelectedIndexChanged(object sender, EventArgs e)
            {
                registrosCorrectosLabel.Text = "";
                sucursales.DataBind();                 //GRIDVIEW
                string nombreSucursal = tablasResulRelacion.Tables[Convert.ToString(listaSucursales.SelectedItem)].TableName; //REFERENCIA NULA AL OBJETO
                int cantFilas = tablasResulRelacion.Tables[Convert.ToString(listaSucursales.SelectedItem)].Rows.Count;
                sucursales.DataSource = tablasResulRelacion.Tables[Convert.ToString(listaSucursales.SelectedItem)];
                if (cantFilas == 0) // Si no tiene registros
                {
                    //Imprimir : Nombre de sucursal tiene los registros correctos
                    registrosCorrectosLabel.Text = nombreSucursal + " tiene los precios actualizados";
                }
                else
                {
                    sucursales.Caption = tablasResulRelacion.Tables[Convert.ToString(listaSucursales.SelectedItem)].TableName;
                    sucursales.DataBind();
                }
            }
    .

    .

    .

    .

    .

        //MAS CÓDIGO

    martes, 29 de mayo de 2012 1:00
  • buen podemos observar que hay uan gran cantidad de variable static

            public static DataSet tablasResulRelacion;
            public ReportesPDF reporte;
            public static string rutaDeArchivoExcel, rutaFisicaAplicacion, rutaDeArchivoPDF, nombreArchivo, rutaArchNuevo;
            public static string nombreArchivoRenombrado;

    las cuales recomendaria quitar ese static inmediatamente porque si requieres de este es porque algo esta mal programado

    lo que me preguntoe s porque has mezclado static si despues hay lugares donde usas

    sessionUsuarioOFP.Text = Session["Usuario"].ToString();

    o sea la Session la conoces, porque no la usas quizas para el tablasResulRelacion ponerlo en Session tambien si es que encesitas conservar los datos entre request

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 29 de mayo de 2012 2:17
  • ummm, ok..... Leandro me podría explicar como es eso de almacenar un objeto dataSet en una session y si de ser posible , acceder a los metodos y propiedades del objeto a traves de la session??

    Yo utilizaba el static para que el objeto no se destruyera en un posback, que podria implementar ahora para esta situación???

    martes, 29 de mayo de 2012 2:49
  • utilizaba el static para que el objeto no se destruyera en un posback,

    claro epro al hacer esto como comenta Jose la variable actua al igual que el objeto Application, o sea a nivel del sitio, y no de le session del usuario

    la variavble static es compartida por todos los usuario, por eso es incorrecto usarlas si la idea es poner informacion de la session

    como es eso de almacenar un objeto dataSet en una session

    lo asignas directamente

    DataSet tablasResulRelacion = result.obtenerDataSetResultRelacion();

    Session["tablasResulRelacion"] = tablasResulRelacion ;

    y para recuperar los datos

    DataSet tablasResulRelacion = Session["tablasResulRelacion"] as DataSet;

    string tablename = tablasResulRelacion.Tables[i].TableName;

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 29 de mayo de 2012 2:58
  • Muchisimas gracias Leandro por tu respuesta, ahora mi ultima pregunta es, la utilización de estas variables de sesion con objetos no disminuye la performance de la aplicación, ya que puede haber tantos objetos como usuarios activos?????
    martes, 29 de mayo de 2012 3:48