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

使用StringBuilder(ASP.NET,C#)时添加的新行,c#,sql,asp.net,row,stringbuilder,C#,Sql,Asp.net,Row,Stringbuilder,我正在尝试使用StringBuilder创建一个字符串,该字符串将用作div的innerHtml。我当前的代码可以工作,但当我刷新页面时,我拥有的数据量会加倍,因此所有内容都会显示两次,这是为什么?我目前的代码如下: protected void refreshUpcomingMaintenance() { StringBuilder sb = new StringBuilder(); sb.Append("<h2>Upcoming Maint

我正在尝试使用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();        
    }

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

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

   ..... // your previous code

}
但是,在web应用程序中,在页面级别使用
静态
字段不是推荐的方法,因为在整个应用程序中共享相同的副本,并且每个用户都将看到相同的数据,这当然是您不希望看到的。每个用户或客户都应该看到自己的数据副本

更好的方法是使它们非静态,以便每次创建新对象时

您可以创建一个类来进行数据库交互,为您提供连接、读取器等,并在页面中重复使用。为了向您展示一个示例,您可以创建一个将返回
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;

}

显示dt填充的代码,可能有问题。我更新了上面的帖子,以显示它是如何填充的。静态数据表是一个问题,您使用的是同一个
DataTable
实例。我在使它们非静态时遇到的问题是我的其他变量无法引用它们。例如,如果我从strSQLConn中取出static,那么我不能在下一行中将其用作sqlConn的参数。解决这个问题的最佳方法是什么?在设置方法之前,创建一个方法并在其中声明这些方法,以便所有的连接和命令创建都在一个函数中完成,我之所以更改它,是因为我必须在多个函数中建立相同的连接。换句话说,设置连接一次,然后在单独的函数中使用它的最佳方法是什么,这样我就不会有太多重复的代码?@FrankTheTank创建一个helper类,该类将包含打开连接关闭连接的方法,执行作为参数etc传递的查询。有关示例,请参阅本文,其中解释了SqlHelper类您可以重复使用,而不是重新发明车轮:
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;

}