我在SQL中有2个过程,它们的结果应该从C#转储为CSV文件。我能够得到1个程序的结果,但我对如何添加第2个程序的结果毫无头绪。
程序1. GetCSVData
程序2。 GetHeader
以下C#代码成功地从过程1(' GetCSVData')将数据转换为CSV。 请帮助我将Procedure2(“GetHeader”)中的数据集成到“GetCSVData”中,并将其写入相同的CSV文件。
我的C#代码:
public string GetCSVData(string SId, string TotalRow)
{ try
{
Sql v = new Sql("Block_Rpt_CSV");
v.Add("SId",SId);
v.Add("TotalRow",TotalRow);
v.Run();
DataTable dt=new DataTable();
dt.Clear();
dt.Columns.Add("a", typeof(String));
dt.Columns.Add("b", typeof(String));
dt.Columns.Add("c", typeof(String));
foreach (System.Data.DataRow item in v.Results.Rows)
{
dt.Rows.Add(item.GetString("Name"),item.GetString("Id"),
item.GetString("Class")
}
dt.AcceptChanges();
string csvData = DataTableToCSVFile(dt, SId, TotalRow);
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
string filename = "CsvView.csv";
response.ContentType = "text/csv";
response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\";");
HttpContext.Current.Response.AddHeader("Content-Length", csvData.Length.ToString());
response.Write(csvData);
response.Flush();
response.End();
AjaxBuilder r = new AjaxBuilder();
r.Add("GetCSVData", "Success");
return r.ToString();
}
catch (Exception e)
{
AjaxBuilder r = new AjaxBuilder();
r.Add("GetCSVData", "Failed");
r.Add("Exception_Message", e.Message);
r.Add("Exception_StackTrace", e.StackTrace);
return r.ToString();
}
}
@Harvey:对不起我到目前为止没看到你的帖子。谢谢你的代码。然而,在我看到你之前,我一直在努力解决这个问题。你能看看我的代码,看看我是否可以让它工作?否则,我将使用您的代码。截至目前,我的所有20个列标题都显示在我的CSV中,显然每列中的数据都不匹配。
private string DataTableToCSVFile(DataTable dt, string SId, string TotalRow)
{ DataTable dtExcel = dt;
StringBuilder sb = new StringBuilder();
sb.Append("CSV Data");
sb.Append("\n");
foreach (DataColumn column in dtExcel.Columns)
{
sb.Append(column.ColumnName + ",");
}
sb.Append("\n");
foreach (DataRow row in dtExcel.Rows)
{
for (int i = 0; i < dtExcel.Columns.Count; i++)
{
sb.Append(row[i].ToString() + ",");
}
sb.Append("\n");
}
return sb.ToString();
}
答案 0 :(得分:0)
您可以将DataTable
对象设为全局,然后在两个函数中使用相同的对象。
先运行您想要的,然后将列和记录插入到id中。然后,运行第二个并相应地插入列和记录。
您还可以为每个函数使用两个单独的DataTable
对象,然后在两者中都收到结果后合并它们。
此外,请确保在调用两个函数后最后编写实际的CSV生成代码。
更新:
以下是在CSV文件中编写数据表值的方法:
string csvPath = System.Web.Hosting.HostingEnvironment.MapPath("pathToCSV.csv");
StreamWriter sw = new StreamWriter(csvPath, false);
if (dtDataTablesList.Rows.Count > 0)
{
//First we will write the headers.
int iColCount = dtDataTablesList.Columns.Count;
for (int i = 0; i < iColCount; i++)
{
sw.Write(dtDataTablesList.Columns[i]);
if (i < iColCount - 1)
{
sw.Write(",");
}
}
sw.Write(sw.NewLine);
// Now write all the rows.
foreach (DataRow dr in dtDataTablesList.Rows)
{
for (int i = 0; i < iColCount; i++)
{
if (!Convert.IsDBNull(dr[i]))
{
sw.Write(dr[i].ToString());
}
if (i < iColCount - 1)
{
sw.Write(",");
}
}
sw.Write(sw.NewLine);
}
}
现在,由于你想要拆分一些列并先写下它们,然后再编写其他列,你必须在这里稍微修改一下for
条件,我认为应该没问题。
希望这能说明如何在这方面取得进展。