C# 如何快速将数据从SQL Server导出到CSV
我正在做一个项目,用C语言将数据导出并导入到.csv文件中。我在导出数据时遇到了困难,所以我写了下面的代码,但它并不灵活。我想在更短的时间内导出它。下面的代码需要更多的时间。我将使用查询从SQL Server获取大量数据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();
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导出库中的任何一个,例如。