c#一段代码, 逻辑上有一句 if 有没有都可以,可是去掉就会报错堆栈溢出,加上就没事,大神帮忙看看是什么原因

string str_cnn = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=";
string str_stringfile = "mdb\mydb.mdb";
OleDbCommand cmd;
OleDbConnection cnn;
OleDbDataReader reader;
string str_sql;

    string str_conn = str_cnn + MapPath(str_stringfile);
    cnn = new OleDbConnection(str_conn);
    str_sql = "SELECT t_menuL0.*, t_menuL1.* FROM t_menuL1 RIGHT JOIN t_menuL0 ON t_menuL1.m1_m0id = t_menuL0.m0_id";
    cnn.Open();
    cmd = new OleDbCommand(str_sql,cnn);
    reader = cmd.ExecuteReader();

//以上是数据库的连接和读取

Panel pl_fenlei, pl_fenleixinwen, pl_cr;
HyperLink hl_xiangmu,hl_fenlei;
//这里定义了几个控件用来添加到前台的 下面是数据读取的循环
while (reader.Read()) {
if (FindControl((div_mainm0id.ID).ToString() + "_" + reader["m0_id"].ToString()) == null) {
// 用m0_id 字段创建对应控件, 但是在数据库中有重复出现,所以要检测
hl_fenlei = new HyperLink();
hl_fenlei.Text = reader["m0_ttl"].ToString();

            pl_fenlei = new Panel();
            pl_fenlei.ID = (div_mainm0id.ID).ToString() + "_" + reader["m0_id"].ToString();
            pl_fenlei.CssClass = "fenlei";
            pl_fenlei.Controls.Add(hl_fenlei);
            pl_fenleixinwen = new Panel();
            pl_fenleixinwen.ID = "fenleixinwen" + "_" + reader["m0_id"].ToString();
            pl_fenleixinwen.CssClass = "fenleixinwen";

            pl_fenlei.Controls.Add(pl_fenleixinwen);
            div_mainm0id.Controls.Add(pl_fenlei);


        }

        hl_xiangmu = new HyperLink();
        hl_xiangmu.Text=reader["m1_ttl"].ToString();

        if (FindControl("fenleixinwen_" + reader["m1_m0id"].ToString())!=null) {
            ((Panel)FindControl("fenleixinwen_" + reader["m1_m0id"].ToString())).Controls.Add(hl_xiangmu);
        }
        // 问题就出在上面的if语句了


    }

    cnn.Close();
// 前台代码什么都没有  就定义了div标签  向标签里面添加数据
<body>
    <form id="form1" runat="server">
    <div>

        <div runat="server" id="div_mainm0id">


        </div>
    </div>

    <div id="div1"></div>
    </form>

</body>

图片说明这是 数据库

堆栈溢出的原因是你一个函数里调用自身造成无限递归了。
比如下面的代码

void foo()
{
 ...
 foo(); //在foo里又调用了foo
 ...
}

具体你可以调试程序,遇到堆栈溢出的时候看下调用堆栈的窗口,就知道哪里写错了