执行不带搜索项的查询会导致System.Runtime.Serialization.dll中出现System.StackOverflow异常

时间:2017-09-19 20:02:38

标签: c# asp.net sql-server

我正在处理一个查询,当使用无搜索字符串或有限搜索字符串调用时,会导致上述错误 该表是30k记录大,当查询被触发没有搜索字符串时,我希望数据库返回所有记录并让Visual Studio将它们放在一个表(ASP.net)中,但是,如果查询被触发,如上所述返回 StackOverflow 错误 :(

如果我使用更具体的搜索字符串触发查询,则脚本似乎正常工作,并且按预期返回结果。

我一直在使用谷歌搜索,所有似乎都指向无限循环或递归,但返回记录让我相信它可能是另一个问题。

查询:

SqlConnection conn = new SqlConnection(_cstring);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
conn.Open();
SqlDataReader dr;

if (mode == "zoek_met_zoekterm")
{   
    cmd.CommandText = "select W1.id, W1.soort_brief, W1.omschrijving, W1.referentie, W1.url, W1.factuur, W3.naam, W3.klantnummer, W4.omschrijving AS w4_omschr, W4.referentie AS w4_ref, substring(W1.referentie,6,2) as w1_jaar, W1.parent AS w1_parent from brief W1 left join brief W4 on W1.parent = W4.id join klant W3 on W3.klantnummer = W1.klantnummer where W1.referentie in (select referentie from brief where substring(referentie,6,2) = @jaar) and (W3.klantnummer like @zoekterm or W1.referentie like @zoekterm or W1.omschrijving like @zoekterm or W3.naam like @zoekterm or W4.omschrijving like @zoekterm) order by W1.id";

    cmd.Parameters.Clear();
    cmd.Parameters.Add("@zoekterm", SqlDbType.VarChar).Value = "%" + (string)parameters["zoekterm"] + "%";
    string jaar = parameters["jaar"].ToString();
    jaar = jaar.Substring(2, 2);
    cmd.Parameters.Add("@jaar", SqlDbType.VarChar).Value = jaar;//(Int32)parameters["jaar"];
    base.LogQuery(cmd);
    dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        CBrief brief = new CBrief();
        brief.Id = dr.GetInt32(0);
        brief.SoortBrief = (Enums.SoortBrief)dr.GetInt32(1);
        brief.Omschrijving = Functies.Decrypt(dr.GetString(2), EncryptData);
        brief.Referentie = Functies.Decrypt(dr.GetString(3), EncryptData);
        brief.Url = Functies.Decrypt(dr.GetString(4), EncryptData);
        brief.Factuur = (Enums.SoortDocument)dr.GetInt32(5);
        brief.Klantnummer = dr.GetInt32(7);
        if (dr.GetString(2).Length == 0)
        {
            if (!dr.IsDBNull(9) && !dr.IsDBNull(8))
                brief.Omschrijving = dr.GetString(9) + " " + dr.GetString(8);
        }
        ret_value.Add(brief);

    }
    dr.Close();
    dr.Dispose();
}

调用查询的函数:

public List<CBrief> GetBriefOverzicht(string zoekterm, int jaar)
{
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("zoekterm", zoekterm);
    parameters.Add("jaar", jaar);
    if (zoekterm.Length == 0)
    {
        return _dal.brief_search(parameters, "geen_invoer");
    }
    return _dal.brief_search(parameters, "zoek_met_zoekterm");
}

最后但并非最不重要的是构建要在Web应用程序中显示的表的函数:

protected void Bzoeken_Click(object sender, EventArgs e)
{
    string zoekterm = TBzoekterm.Text;
    DateTime nu = DateTime.Now;
    int jaar = nu.Year;

    List<CBrief> brieven = br_rbs.GetBriefOverzichtWijzigen(zoekterm);

    StringBuilder overzicht = new StringBuilder("<table class=\"tabel-beheer-1\">");

    foreach (CBrief b in brieven)
    {
        List<CBijlage> bijlagen = new List<CBijlage>();
        CKlant k = sec.GetKlant(b.Klantnummer);
        string klantnaam = k.Naam;
        string richting = "";
        if (b.OmschrijvingAanwezig == true)
        {
            bijlagen = br_rbs.GetBijlagenBrieven(b.Id);
        }
        if (b.SoortBrief == Enums.SoortBrief.Inkomend) richting = "van: "; else richting = "naar: ";
        // MG10082017 Ik heb hier twee icoontjes in elkaar geflanst om te testen. Deze moeten nog aangepast worden zodat ze in het geheeel passen. 
        overzicht.AppendLine("<tr><td><a href=\"test.nl\"><img src=\"/images/bg/document.jpg\" alt=\"open document\"></a></td><td><a href=\"detail_brief.aspx?id=" + b.Id + "\"><img src=\"/images/bg/detail.jpg\" alt=\"details\"></a></td><td><b>" + b.Referentie + "</b></td><td><i>" + b.SoortBrief.ToString() + " " + richting + "</i> " + klantnaam + "</td><td><b> " + b.Factuur.ToString() + ":</b> " + b.Omschrijving  /*+"</td><td>"*/);
        if (bijlagen.Count > 0)
        {
            foreach (CBijlage bijl in bijlagen)
            {
                overzicht.AppendLine("</br><a href =\"" + bijl.Url + "\"> " + bijl.Naam + "</a>");
            }

        }
    }
    overzicht.AppendLine("</td></tr></table>");
    Loverzicht.Text = overzicht.ToString();
}

错误通常指向:System.Web.dll或w3wp.exe(未在调试模式下运行时)。如果我的假设是错误的并且似乎是无限循环或递归,我将如何找到它?

查询在MS-SQL管理控制台中完美无瑕。

1 个答案:

答案 0 :(得分:0)

问题不是无限循环! 问题在于UI。 没有StackOverflow-Exception,您不能一次显示30k单位。 您应该使用pageIndex一次调用大约20或30个单位的页面。 这样,您的应用程序将表现更好并避免此类错误。