如何将C#中2个SQL过程的结果附加到单个CSV文件中?

时间:2015-06-03 09:42:30

标签: c# mysql sql-server csv stored-procedures

我在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();


    }

1 个答案:

答案 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条件,我认为应该没问题。

希望这能说明如何在这方面取得进展。