我有一个网站,允许用户使用特定搜索条件(国家和日期)将数据下载到 CSV 文件。他们从下拉列表和 JQuery 日期选择器中选择所有信息。
导出对于小数据集非常有效,但是当您尝试下载 10000 行数据时,它会花费很长时间,甚至可能会超时!
我已经尝试过不同的方法来做到这一点,但由于这个项目的时间限制,我想坚持使用这种方法。
我的代码如下:
using (SqlConnection con = new SqlConnection(cs))
{
if (country.Contains("GB"))
{
using (SqlCommand cmd = new SqlCommand("SELECT * from " + logData + " where country in ('GB') and close_date between '" + fromDate + "' and '" + toDate + "'"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
//Build the CSV file data as a Comma separated string.
string csv = string.Empty;
foreach (DataColumn column in dt.Columns)
{
//Add the Header row for CSV file.
csv += column.ColumnName + ',';
}
//Console.Write(cmd);
//Add new line.
csv += "\r\n";
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
//Add the Data rows.
//Response.Write(row[column.ColumnName].ToString().Replace(",", ";") + ',');
csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
}
//Add new line.
csv += "\r\n";
}
//Download the CSV file.
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=data.csv");
Response.Charset = "";
Response.ContentType = "application/text";
Response.Output.Write(csv);
Response.Flush();
Response.End();
}
}
}
}
Response.Write(row[column.ColumnName].ToString().Replace(",", ";") + ',');
csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
如果我使用Response.Write...,文件下载速度MUCH,但数据都在一行中并且不包括标题。 CSV += row... 慢得多,偶尔会超时
如果我要使用 Response.Write 并包含标题,如何将数据分隔到多行?
实际的 SQL 查询需要 2 秒才能运行并产生 12231 条记录
最佳答案
是的,字符串连接非常慢,因为 C# 中的字符串是不可变的。我建议您使用 StringBuilder 类 ( https://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.110).aspx) 来构造您的字符串。
关于c# - 在 C# 中使用 select 语句动态创建 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42365935/