Ver Mensaje Individual
  #8 (permalink)  
Antiguo 25/07/2007, 04:29
Avatar de zacktagnan
zacktagnan
 
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 10 meses
Puntos: 3
Re: Construir una lista dinámicamente

Hola de nuevo kornissues12:

He hecho lo que dices respecto a cómo abrir y cerrar adecuadamente la conexión y definir las variables SqlConnection cnDatos y DataTable dtMenuItems a static, quitar lo de abrir y cerrar la conexión dentro de las funciones secundarias llamadas dentro de construirMenu(), quedando así:

Código:
...

static SqlConnection cnDatos = new SqlConnection("server=NOMBRE_SERVIDOR;database=NOM BRE_BASEdeDATOS;uid=sa;");

static DataTable dtMenuItems = new DataTable();

...

protected void Page_Load(object sender, EventArgs e)
{
...
}

protected string construirMenu()
{
...
        //********CONOPEN
        cnDatos.Open();
        try//********TRY
        {
            //RECOGIENDO LOS DATOS DE LA BASE DE DATOS
            //==========================================
            //INVOCANDO AL PROCEDIMIENTO ALMACENADO
            SqlDataAdapter daMenu = new SqlDataAdapter("ObtenerOpciones_Menu", cnDatos);
            daMenu.SelectCommand.CommandType = CommandType.StoredProcedure;
            //LLENANDO EL DataTable
            daMenu.Fill(dtMenuItems);
            //RECORRIENDO EL DataTable PARA AGREGAR LOS ELEMENTOS QUE ESTARÁN EN LA CABECERA DEL MENÚ
            foreach (DataRow drMenuItem in dtMenuItems.Rows)
            {
                //VER SI HAY SUBMENÚS PARA EL NIVEL SUPERIOR RECORRIDO
                haySubmenus(drMenuItem["mnu_id"].ToString());
                if (total_TOTSubniv > 0)
                {
                    //HABIENDO SUBMENÚS
                    //====================================================
                    /*Response.Write("[drMenuItem[\"mnu_perfiles\"].ToString()] = " + drMenuItem["mnu_perfiles"].ToString());*/
                    //>>>> COMPROBANDO PERFILES VÁLIDOS
                    perfiles_ok(drMenuItem["mnu_perfiles"].ToString());
                    //SÓLO SI PERFIL VÁLIDO
                    if (menu_ok > 0)
                    {/**///*****************************************
                        ////Response.Write("<BR />El Menú [" + drMenuItem["mnu_txt"].ToString() + "] tiene " + total_TOTSubniv + " submenú(s)");
                        //ESTA CONDICION INDICA QUE SON ELEMENTOS PADRE
                        if (drMenuItem["mnu_id"].ToString() == drMenuItem["mnu_padre_id"].ToString())
                        {
                            elMenu = elMenu + "<li><a href=\"" + drMenuItem["mnu_url"].ToString() + "\">" + (drMenuItem["mnu_txt"].ToString()).ToUpper() + "<!--[if IE 7]><!--></a><!--<![endif]--><!--[if lte IE 6]><table><tr><td><![endif]-->";
                            obtenSubmenus(drMenuItem["mnu_id"].ToString());
                            elMenu = elMenu + "<!--[if lte IE 6]></td></tr></table></a><![endif]--></li>";
                        }
                    }//FIN DE SÓLO SI PERFIL VÁLIDO/**///*****************************************
                }
                else
                {
                    //NO HABIENDO SUBMENÚS
                    //====================================================
                    //>>>> COMPROBANDO PERFILES VÁLIDOS
                    perfiles_ok(drMenuItem["mnu_perfiles"].ToString());
                    //SÓLO SI PERFIL VÁLIDO
                    //Y SIENDO MENÚS QUE VAN SIN SUBMENÚS POR DEFECTO
                    if (menu_ok > 0 && bool.Parse(drMenuItem["mnu_nosubmnus"].ToString()) == true)
                    {/**///*****************************************
                        //ESTA CONDICION INDICA QUE SON ELEMENTOS PADRE
                        if (drMenuItem["mnu_id"].ToString() == drMenuItem["mnu_padre_id"].ToString())
                        {
                            elMenu = elMenu + "<li><a href=\"" + drMenuItem["mnu_url"].ToString() + "\">" + drMenuItem["mnu_txt"].ToString().ToUpper() + "</a></li>";
                        }
                    }//FIN DE SÓLO SI PERFIL VÁLIDO/**///*****************************************
                }
            }//fin foreach
        }//********FIN TRY
        //********CATCH
        catch (SqlException ex_construirMenu)
        {
            Response.Write("Se ha producido un error: " + ex_construirMenu);
        }//********FIN CATCH
        //********FINALLY//********CONCLOSE
        finally
        {
            cnDatos.Close();
        }
...
}
y en las funciones quitando ó comentando las aperturas y cierres de conexión que había:
Código:
    protected int haySubmenus(string menuId)
    {
        string sql_TOTSubniv = "SELECT COUNT(mnu_id) FROM MENU WHERE mnu_padre_id=" + menuId + " AND mnu_id<>" + menuId + " AND mnu_perfiles LIKE '%" + (Session["perfil_id"]).ToString() + "%'";
        SqlCommand coman_TOTSubniv = new SqlCommand(sql_TOTSubniv, cnDatos);

        try
        {
            ////cnDatos.Open();
            //RECOGIENDO EL RESULTADO DEL COUNT(mnu_id)
            total_TOTSubniv = int.Parse(coman_TOTSubniv.ExecuteScalar().ToString());
            ////cnDatos.Close();
        }
        catch (SqlException ex_TOTSubniv)
        {
            Response.Write("Se ha producido un error: " + ex_TOTSubniv);
        }

        return total_TOTSubniv;
    }//FIN DE haySubmenus(...)

    protected string obtenSubmenus(string menuId)
    {
        DataTable dtSubMenus = new DataTable();
        SqlDataAdapter daSubMenus = new SqlDataAdapter("SELECT * FROM MENU WHERE mnu_padre_id=" + menuId + " AND mnu_id<>" + menuId + " AND mnu_perfiles LIKE '%" + (Session["perfil_id"]).ToString() + "%'" + " ORDER BY mnu_posicion, mnu_txt", cnDatos);
        //daSubMenus.SelectCommand.CommandType = CommandType.StoredProcedure;
        //LLENANDO EL DataTable
        daSubMenus.Fill(dtSubMenus);
        try
        {
            ////cnDatos.Open();
            elMenu = elMenu + "<ul>";
            foreach (DataRow drSubMenus in dtSubMenus.Rows)
            {
                haySubmenus(drSubMenus["mnu_id"].ToString());
                if (total_TOTSubniv > 0)
                {
                    //HABIENDO SUBMENÚS
                    //====================================================
                    //>>>> COMPROBANDO PERFILES VÁLIDOS
                    perfiles_ok(drSubMenus["mnu_perfiles"].ToString());
                    //SÓLO SI PERFIL VÁLIDO
                    if (menu_ok > 0)
                    {/**///*****************************************
                        elMenu = elMenu + "<li><a class=\"drop\" href=\"" + drSubMenus["mnu_url"].ToString() + "\" title=\"" + drSubMenus["mnu_txt"].ToString() + "\">" + drSubMenus["mnu_txt"].ToString() + "<!--[if IE 7]><!--></a><!--<![endif]--><!--[if lte IE 6]><table><tr><td><![endif]-->";
                        obtenSubmenus(drSubMenus["mnu_id"].ToString());
                        elMenu = elMenu + "<!--[if lte IE 6]></td></tr></table></a><![endif]--></li>";
                    }/**///*****************************************
                }
                else
                {
                    //NO HABIENDO SUBMENÚS
                    //====================================================
                    //>>>> COMPROBANDO PERFILES VÁLIDOS
                    perfiles_ok(drSubMenus["mnu_perfiles"].ToString());
                    //SÓLO SI PERFIL VÁLIDO
                    //Y SIENDO MENÚS QUE VAN SIN SUBMENÚS POR DEFECTO
                    if (menu_ok > 0 && bool.Parse(drSubMenus["mnu_nosubmnus"].ToString()) == true)
                    {/**///*****************************************
                        elMenu = elMenu + "<li><a href=\"" + drSubMenus["mnu_url"].ToString() + "\" title=\"" + drSubMenus["mnu_txt"].ToString() + "\">" + drSubMenus["mnu_txt"].ToString() + "</a></li>";
                    }/**///*****************************************
                }
            }
            elMenu = elMenu + "</ul>";
            ////cnDatos.Close();
        }
        catch (SqlException ex_TOTSubniv)
        {
            Response.Write("Se ha producido un error: " + ex_TOTSubniv);
        }

        return subMenus;
    }//FIN DE obtenSubmenus(...)

En principio, parece que no debería dar problema. Y lo he subido a internet y va.

La cosa es que se me ha ocurrido actualizar la página y entonces me duplica el menú. Es decir, por cada actualización de página me construye de nuevo el menú...

No sé por qué será está cosa...

Total que me ha dado por probar a quitar la definición static de las variables mencionadas, y entonces no me produce ningún error.

Código:
SqlConnection cnDatos = new SqlConnection("server=NOMBRE_SERVIDOR;database=NOM BRE_BASEdeDATOS;uid=sa;");

DataTable dtMenuItems = new DataTable();
¿¿¿Sabes la explicación de esto???

Respecto a lo otro que explicas, trataré de mirarlo en cuánto tenga algo de tiempo libre. Gracias.
__________________
Saludos,

zacktagnan.
=================================================