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