C# 如何快速将数据从SQL Server导出到CSV

C# 如何快速将数据从SQL Server导出到CSV,c#,asp.net,sql-server,csv,C#,Asp.net,Sql Server,Csv,我正在做一个项目,用C语言将数据导出并导入到.csv文件中。我在导出数据时遇到了困难,所以我写了下面的代码,但它并不灵活。我想在更短的时间内导出它。下面的代码需要更多的时间。我将使用查询从SQL Server获取大量数据 public static void ExportPlantData(string channelId) { string query = string.Empty; DataService dataService = new DataService();

我正在做一个项目,用C语言将数据导出并导入到.csv文件中。我在导出数据时遇到了困难,所以我写了下面的代码,但它并不灵活。我想在更短的时间内导出它。下面的代码需要更多的时间。我将使用查询从SQL Server获取大量数据

public static void ExportPlantData(string channelId)
{
    string query = string.Empty;

    DataService dataService = new DataService();
    DbCommand dataCmd = null;
    DataTable contentToExport = new DataTable();

    try
    {
        query = "SELECT * from tablename";

        dataCmd = dataService.Database.GetSqlStringCommand(query);
        contentToExport = dataService.ExecuteDataTable(dataCmd);
        ExportToCSV(contentToExport);
    }    
}
我从表中提取了大量数据。之后,我打算将该数据导出到.csv,但使用以下代码导出需要很长时间:

public static void ExportToCSV(DataTable contentToexport)
{
    string csvData = string.Empty;
    string headers = string.Empty;

    foreach (DataRow row in contentToexport.Rows)
    {
        headers = string.Empty;

        foreach (DataColumn column in contentToexport.Columns)
        {
            csvData += row[column].ToString() + ",";
            headers += column.ColumnName + ",";
        }

        csvData += "\r\n";
        headers += "\r\n";
    }

    string contentToExport = headers + csvData;
    string attachment = "attachment; filename=export.csv";

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.AddHeader("content-disposition", attachment);
    HttpContext.Current.Response.ContentType = "application/csv";
    HttpContext.Current.Response.AddHeader("Pragma", "public");
    HttpContext.Current.Response.Write(contentToExport);

    System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();
}

它之所以慢,是因为您一直在构建字符串,这会导致内存重新分配。改用StringBuilder。第二,您有一个错误,您总是用每一行构建标题,而不是一次

public static void ExportToCSV(DataTable contentToexport)
        {
            var csvData = new StringBuilder();

            foreach (DataColumn column in contentToexport.Columns)
            {
                if (csvData.Length > 0) csvData.Append(",");
                csvData.Append(column.ColumnName);
            }
            csvData.Append(Environment.NewLine);

            foreach (DataRow row in contentToexport.Rows)
            {
                var newLine = true;
                foreach (DataColumn column in contentToexport.Columns)
                {
                    if (!newLine) csvData.Append(",");
                    newLine = false;
                    var cellValue = row[column].ToString();
                    var cellValueHasQuotes = cellValue.Contains("\"");
                    if (cellValueHasQuotes)
                    {
                        csvData.Append("\"");
                        cellValue = cellValue.Replace("\"", "\"\"");
                    }
                    csvData.Append(cellValue);
                    if (cellValueHasQuotes)
                    {
                        csvData.Append("\"");
                    }
                }

                csvData.Append(Environment.NewLine);
            }

            string contentToExport = csvData.ToString();
            string attachment = "attachment; filename=export.csv";

            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ClearHeaders();
            HttpContext.Current.Response.ClearContent();
            HttpContext.Current.Response.AddHeader("content-disposition", attachment);
            HttpContext.Current.Response.ContentType = "application/csv";
            HttpContext.Current.Response.AddHeader("Pragma", "public");
            HttpContext.Current.Response.Write(contentToExport);
            System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();
        }

另一种可能是直接写入响应体,并进行一些修改。

更改字符串变量,使其类似

public static void ExportToCSV(DataTable contentToexport)
{
    StringBuilder csvData = new StringBuilder();
    StringBuilder headers = new StringBuilder();

    foreach (DataRow row in contentToexport.Rows)
    {
        headers = string.Empty;
        foreach (DataColumn column in contentToexport.Columns)
        {
            csvData.Append(row[column].ToString() + ",");
            headers.Append(column.ColumnName + ",");
        }

       csvData.Append("\r\n");
       headers.Append("\r\n");
    }

    string contentToExport = headers.Append(csvData.ToString()).ToString();
    string attachment = "attachment; filename=export.csv";

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.AddHeader("content-disposition", attachment);
    HttpContext.Current.Response.ContentType = "application/csv";
    HttpContext.Current.Response.AddHeader("Pragma", "public");
    HttpContext.Current.Response.Write(contentToExport);
    System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();
}

这将使您的工作速度比早期版本更快。

如果没有业务规则,并且您同样希望通过select语句获得的内容导出到csv,那么我认为您应该选择所有列值作为所有行的单列逗号分隔值。所以你得到了一列多行。然后,您需要在应用程序中只遍历一行。您应该使用StringBuilder对象。为什么还要重新发明轮子?使用许多现成的CSV导出库中的任何一个,例如。