使用 StringBuilder 时添加了新行(ASP.NET,C#)

New Rows Added when using StringBuilder (ASP.NET, C#)

我正在尝试使用 StringBuilder 创建一个将用作 div 的 innerHtml 的字符串。我当前的代码有效,但是当我刷新页面时,我拥有的数据量加倍,因此所有内容都显示两次,这是为什么?我目前的代码如下:

protected void refreshUpcomingMaintenance()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("<h2>Upcoming Maintenance</h2>");

        foreach (DataRow row in dt.Rows)
        {
            if (row["Status"].ToString() != null 
                && row["Status"].ToString() == "A         "
                && (row["Type"].ToString() == "Planned Outage")
                && (DateTime.Now < DateTime.Parse(row["StartTime"].ToString())))
            {
                sb.Append("<p>NEW UPCOMING EVENT</p>");
                sb.Append("<p>" + (row["SubjectLine"].ToString()) + "</p>");
            }
        }

        upcomingMaintenanceHolder.InnerHtml = sb.ToString();        
    }

因此,当页面首次加载时,一切正常,应该显示的两个事件附加到 sb (StringBuilder),我将 div 上的 innerHtml 设置为字符串的 StringBuilder 值。但是,问题是当我在页面上单击刷新而不是显示两个事件时,我的屏幕现在显示 4 个。

我做了一些调试,每次刷新页面时 dt.Rows 的计数都会翻倍,这就是为什么会发生这种情况,但为什么 dt.Rows 的计数每次都会翻倍?我的实际 SQL 数据库中的行数不会仅更改代码中此时的计数(仅在这种情况下,行不会在 SQL 中重复)。谢谢您的帮助。

此外,作为参考,这是 dt 的填充方式:

private static string strSQLConn = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString;
    private static SqlConnection sqlConn = new SqlConnection(strSQLConn);
    private static DataTable dt = new DataTable();
    private static SqlCommand command = new SqlCommand("getNetEvents", sqlConn);

    protected void Page_Load(object sender, EventArgs e)
    {
        headerDate.InnerText = DateTime.Now.ToString();

        command.CommandType = CommandType.StoredProcedure;
        sqlConn.Open();
        SqlDataAdapter da = new SqlDataAdapter(command);
        da.Fill(dt);

        this.refreshStatus();
        refreshUpcomingMaintenance();

        sqlConn.Close();
    }

这是因为您将 dt 定义为 static 并且它的相同副本正在您的应用程序中维护并重复使用。一个快速的肮脏修复是在页面加载时清除行,然后再填充它:

protected void Page_Load(object sender, EventArgs e)
{
   dt.Rows.Clear();

   ..... // your previous code

}

但这不是在 Web 应用程序中在页面级别使用 static 字段的推荐方式,因为在整个应用程序中共享相同的副本,并且每个用户都会看到与 of-course 您相同的数据不想。每个用户或客户都应该看到他的数据副本。

更好的方法是使它们 non-static 以便每次创建新对象时。

您可以做的是创建一个 class 来进行数据库交互,以便为您提供连接、reader 等以及页面中的 re-use。只是为了向您展示一个示例,您可以创建一个方法,该方法将 return DataTable 实例返回:

protected void Page_Load(object sender, EventArgs e)
{
    headerDate.InnerText = DateTime.Now.ToString();

    DataTable dt = GetData();
    // now use it as needed



}

private DataTable GetData()
{
   string strSQLConn = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString;
   SqlConnection sqlConn = new SqlConnection(strSQLConn);
   DataTable dt = new DataTable();
   SqlCommand command = new SqlCommand("getNetEvents", sqlConn);
   command.CommandType = CommandType.StoredProcedure;
   sqlConn.Open();
   SqlDataAdapter da = new SqlDataAdapter(command);
   da.Fill(dt);

    sqlConn.Close();

   return dt;

}