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

时间:2014-08-18 19:02:48

标签: c# sql datatable stringbuilder

我正在尝试从包含24个月客户付款历史记录的数据表构建一个html表。但是,仅返回第一行数据(最近一次付款)并重复24次。在查询构建器中运行时,Select语句返回24个不同的行。是foreach循环写自己?我不认为我只用24行超载了stringbuilder。我尝试添加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();
        }

4 个答案:

答案 0 :(得分:1)

您遍历每一行,但只设置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>");
        }

您需要在该循环中更新其值。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

你正在遍历每一行:

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内进行了大量的字符串连接。您应该单独附加每个项目,避免繁重的连接。

答案 3 :(得分:0)

这是因为以下所有变量都包含对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();
}