[英]How to convert multiple rows into one row with multiple columns using Pivot in SQL Server when data having NULL values
[英]Using StringBuilder and a DataTable, How do I return multiple rows in three columns without breaking when there is only one row?
我有一個函數,該函數根據調用的ID從SQL存儲的Proc返回電子郵件地址列表。 它使用StringBuilder並返回一列。 對於大多數ID,電子郵件地址為4個或更少,這種格式很好。 但是,我們現在獲得了更多具有10多個電子郵件地址的ID,這使頁面過長。
該函數是:
DataTable dt = DAL.ExecStoredProc(DAL.DatabaseName.DB, "storedProc", param);
StringBuilder sb = new StringBuilder();
sb.Append("<br/><br/>");
sb.Append("<table border='0' cellpadding='3'>");
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append("<tr><td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
sb.Append("</td></tr>");
}
sb.Append("</table>");
return sb.ToString();
我嘗試使用以下內容,但是在返回的地址太少時會中斷:
DataTable dt = DAL.ExecStoredProc(DAL.DatabaseName.DB, "storedProc", param);
StringBuilder sb = new StringBuilder();
sb.Append("<br/><br/>");
sb.Append("<table border='0' cellpadding='3'>");
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append("<tr><td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
i++;
sb.Append("</td>");
sb.Append("<td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
i++;
sb.Append("</td>");
sb.Append("<td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
i++;
sb.Append("</td></tr>");
}
sb.Append("</table>");
return sb.ToString();
使用Linq的Take
函數,您可以從第一個示例中替換以下代碼塊:
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append("<tr><td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
sb.Append("</td></tr>");
}
有了這個:
foreach (var row in dt.Rows.OfType<DataRow>().Take(3))
{
sb.Append("<tr><td>");
sb.Append(row["EMail"].ToString());
sb.Append("</td></tr>");
}
由於Take從序列的開頭最多返回指定數量的元素,因此該代碼塊將在0到3次之間任意運行。 您最多將顯示3個地址(即使存在更多地址),如果少於3個,則不會獲得IndexOutOfRangeException
。
更新:與ASP.NET 2.0兼容
由於您不能使用Linq,因此結果應相同:
for (int i = 0; i < (dt.Rows.Count > 3 ? 3 : dt.Rows.Count); i++)
{
sb.Append("<tr><td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
sb.Append("</td></tr>");
}
表達式dt.Rows.Count > 3 ? 3 : dt.Rows.Count
dt.Rows.Count > 3 ? 3 : dt.Rows.Count
使用?
運算符使for
循環遍歷所有電子郵件地址,除非有3個以上,否則將僅循環3次。
您可以考慮使用asp.net轉發器控件,而不是使用字符串生成器構建html表。 您可以將DataTable直接綁定到轉發器,然后從html設計圖面控制html。 對於您想做的事情,它將被證明更加靈活。 這是假設您正在使用asp.net。
另請參閱我關於創建自定義asp.net控件的文章,因為這將為您提供最大的靈活性並封裝您的自定義html邏輯。
請享用!
我認為Doug走在正確的軌道上,但是如果您堅持使用StringBuilder和for循環來做到這一點,請嘗試以下操作:
DataTable dt = DAL.ExecStoredProc(DAL.DatabaseName.DB, "storedProc", param);
StringBuilder sb = new StringBuilder();
sb.Append("<br/><br/>");
sb.Append("<table border='0' cellpadding='3'>");
string rowFormat = "<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>";
for (int i = 0; i < dt.Rows.Count; i+=3)
{
string[] rowEmails = { String.Empty, String.Empty, String.Empty };
for (int j = 0; j < 3; j++)
{
if (i+j < dt.Rows.Count) rowEmails[j] = dt.Rows[i+j]["Email"].ToString();
}
sb.AppendFormat(rowFormat, rowEmails[0], rowEmails[1], rowEmails[2]);
}
sb.Append("</table>");
return sb.ToString();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.