c# - 在 C# 中使用 select 语句动态创建 CSV 文件

标签 c# mysql csv

我有一个网站,允许用户使用特定搜索条件(国家和日期)将数据下载到 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/

相关文章:

c# - ZeroMQ,客户端<->服务器,仅让客户端连接到主机就可以进行双向通信?

php - 使用 php 使用表单将记录添加到数据库

python - pandas 计算中的最小值

python - 解析空格分隔的命名字段

c# - 关闭颁发者验证或修改 IdentityServer4 中的有效颁发者

c# - 图像余弦波

python - 为什么现在还有 "commands out of sync; you can' t run this command”错误

php 脚本未正确传递值或未正确从 mysql 查询

python - 如何使用openurl和multiprocessing同时获取URL不同的数据?

c# - XmlDocument.Load 失败,LoadXml 有效 :