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.