StringBuilder重复添加数据表的第一行

本文关键字:一行 添加 数据表 StringBuilder | 更新日期: 2023-09-27 18:18:27

我试图从一个包含24个月客户付款历史的数据表建立一个html表。但是,只返回第一行数据(最近的付款),并且重复24次。Select语句在查询生成器中运行时返回24个不同的行。foreach循环是否重写了自身?我不认为我超载的stringbuilder只有24行。我尝试添加AppendLine();但这不会改变任何事情。

        //get account history
        String strConnString7 = WebConfigurationManager.ConnectionStrings["billing_webConnectionString"].ConnectionString;
        SqlConnection con7 = new SqlConnection(strConnString7);
        SqlCommand cmd7 = new SqlCommand("SELECT * FROM dbo.WEB_HISTORY WHERE acct_nbr ='" + AcctNbr + "'ORDER BY billing_date DESC", con7);
        cmd7.Parameters.Add("conn_nbr", SqlDbType.VarChar).Value = Session["AcctNum"];
        cmd7.Connection = con7;
        SqlDataAdapter da7 = new SqlDataAdapter(cmd7);
        DataTable dtHistory = new DataTable();
        da7.Fill(dtHistory);

        if (dtHistory != null && dtHistory.Rows.Count > 0)
        {
            string Billing_Date = String.Format("{0:d}", dtHistory.Rows[0]["billing_date"]);
            string W_Cons = dtHistory.Rows[0]["w_cons"].ToString();
            string W_Curr_Chrg = String.Format("{0:0.00}", dtHistory.Rows[0]["w_curr_chrg"]);
            string S_Curr_Chrg = String.Format("{0:0.00}", dtHistory.Rows[0]["s_curr_chrg"]);
            string Adjs = String.Format("{0:0.00}", dtHistory.Rows[0]["adjs"]);
            string Pay = String.Format("{0:0.00}", dtHistory.Rows[0]["pay"]);
            string Return_pay = String.Format("{0:0.00}", dtHistory.Rows[0]["return_pay"]);

           System.Text.StringBuilder sb = new System.Text.StringBuilder();
            int counter = 0;
            foreach (DataRow row in dtHistory.Rows)   
            {
                sb.Append("<tr><td>" + Billing_Date + "</td><td>" + W_Cons + "</td><td>" + W_Curr_Chrg + "</td><td>" + S_Curr_Chrg + "</td><td>" + Adjs + "</td><td>" + Pay + "</td><td>" + Return_pay + "</td></tr>");
                }

            History.Text = sb.ToString();
            //Counter.Text = counter.ToString();
            con7.Close();
        }

StringBuilder重复添加数据表的第一行

遍历每一行,但只设置Billing_DateW_ConsW_Curr_ChrgS_Curr_ChrgAdjsPayReturn_pay一次:

        string Billing_Date = String.Format("{0:d}", dtHistory.Rows[0]["billing_date"]);
        string W_Cons = dtHistory.Rows[0]["w_cons"].ToString();
        string W_Curr_Chrg = String.Format("{0:0.00}", dtHistory.Rows[0]["w_curr_chrg"]);
        string S_Curr_Chrg = String.Format("{0:0.00}", dtHistory.Rows[0]["s_curr_chrg"]);
        string Adjs = String.Format("{0:0.00}", dtHistory.Rows[0]["adjs"]);
        string Pay = String.Format("{0:0.00}", dtHistory.Rows[0]["pay"]);
        string Return_pay = String.Format("{0:0.00}", dtHistory.Rows[0]["return_pay"]);

当你循环遍历行时,你每次都添加它们,但你实际上并没有更新它们——所以它们的值永远不会从你最初设置的值改变。

        foreach (DataRow row in dtHistory.Rows)   
        {
            sb.Append("<tr><td>" + Billing_Date + "</td><td>" + W_Cons + "</td><td>" + W_Curr_Chrg + "</td><td>" + S_Curr_Chrg + "</td><td>" + Adjs + "</td><td>" + Pay + "</td><td>" + Return_pay + "</td></tr>");
        }

你需要在循环中更新它们的值

您在foreach循环中使用固定数据。

例如,Billing_Date设置在循环的顶部,因此将始终包含相同的值。

循环需要访问row变量以从每行获取数据。

你正在遍历每一行:

foreach (DataRow row in dtHistory.Rows) 

但是在循环中,你永远不会使用row对象

sb.Append("<tr><td>" + Billing_Date + "</td><td>" + W_Cons + "</td><td>" + W_Curr_Chrg + "</td><td>" + S_Curr_Chrg + "</td><td>" + Adjs + "</td><td>" + Pay + "</td><td>" + Return_pay + "</td></tr>");

而不是Billing_Date我假设你想要row["billing_date"]

作为旁注,您在sb.Append中进行了大量的字符串连接。你应该单独附加每一项,避免过多的连接。

这是因为下面所有变量都包含对Rows[0]值的引用。您需要更改它以检索各自数据行的值并构建StringBuilder。

string Billing_Date = String.Format("{0:d}", dtHistory.Rows[0]["billing_date"]);
string W_Cons = dtHistory.Rows[0]["w_cons"].ToString();
string W_Curr_Chrg = String.Format("{0:0.00}", dtHistory.Rows[0]["w_curr_chrg"]);
string S_Curr_Chrg = String.Format("{0:0.00}", dtHistory.Rows[0]["s_curr_chrg"]);
string Adjs = String.Format("{0:0.00}", dtHistory.Rows[0]["adjs"]);
string Pay = String.Format("{0:0.00}", dtHistory.Rows[0]["pay"]);
string Return_pay = String.Format("{0:0.00}", dtHistory.Rows[0]["return_pay"]);

那么你的if语句将变成

if (dtHistory != null && dtHistory.Rows.Count > 0)
{
   System.Text.StringBuilder sb = new System.Text.StringBuilder();
   foreach (DataRow row in dtHistory.Rows)   
   {
      string Billing_Date = String.Format("{0:d}", row["billing_date"]);
      string W_Cons = dtHistory.row["w_cons"].ToString();
      string W_Curr_Chrg = String.Format("{0:0.00}", row["w_curr_chrg"]);
      string S_Curr_Chrg = String.Format("{0:0.00}", row["s_curr_chrg"]);
      string Adjs = String.Format("{0:0.00}", row["adjs"]);
      string Pay = String.Format("{0:0.00}", row["pay"]);
      string Return_pay = String.Format("{0:0.00}", row["return_pay"]);
      sb.Append("<tr><td>" + Billing_Date + "</td><td>" + W_Cons + "</td><td>" + W_Curr_Chrg + "</td><td>" + S_Curr_Chrg + "</td><td>" + Adjs + "</td><td>" + Pay + "</td><td>" + Return_pay + "</td></tr>");
   }
      History.Text = sb.ToString();
      con7.Close();
}