【问题标题】:C# Generated CSV changes the format of the data retrieved from a SQL databaseC# 生成的 CSV 更改从 SQL 数据库检索的数据的格式
【发布时间】:2017-02-06 05:47:32
【问题描述】:
protected void ExportCSV(object sender, EventArgs e)
{

DataTable ds = new DataTable();
ds.Columns.AddRange(new DataColumn[1] { new DataColumn("Name") });
foreach (GridViewRow roww in GridView1.Rows)

{
    if (roww.RowType == DataControlRowType.DataRow)
    {
        CheckBox chkRow = (roww.Cells[0].FindControl("chkRow") as CheckBox);

        if (chkRow.Checked)
        {
            string name = roww.Cells[1].Text;
            string DefaultConnection = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            using (SqlConnection con = new SqlConnection(DefaultConnection))

            {
                SqlCommand command = new SqlCommand();

                using (SqlCommand cmd = new SqlCommand("Select AssignNumber, Stage.StageName,Stage.StationName,AspNetUsers.UserName,RecordedDateTime,StartTime,EndTime,Duration,PauseCount,PauseTotalTime,StageRecord.Count, StageRecord.Notes,Location,VarName,DropOut From TimingProfile Inner Join StudyRecord ON TimingProfile.TimingProfileID = StudyRecord.TimingProfileID Inner Join StageRecord ON StudyRecord.StudyRecordID = StageRecord.StudyRecordID Left Join Stage ON StageRecord.StageID = Stage.StageID Left Join VarAffect ON StageRecord.VarID = VarAffect.VarID Left Join MultiNameValue ON StudyRecord.StudyRecordID = MultiNameValue.StudyRecordID Left Join UserStage ON UserStage.StageID = Stage.StageID Left Join AspNetUsers ON UserStage.UserID = AspNetUsers.Id Where TimingProfile.Name = " + "'"+name+"'"))

                    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 + ',';
                            }

                            //Add new line.
                            csv += "\r\n";

                            foreach (DataRow row in dt.Rows)
                            {
                                foreach (DataColumn column in dt.Columns)
                                {
                                    //Add the Data rows.
                                    csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
                                }

                                //Add new line.
                                csv += "\r\n";
                            }
                            DateTime localdate = DateTime.Now;
                        //Download the CSV file.

                        Response.Clear();
                            Response.Buffer = true;
                            Response.AddHeader("content-disposition", "attachment;filename=MultiStation" + "" + name + " " + localdate + ".csv");

                        Response.Charset = "";
                            Response.ContentType = "application/text";
                            Response.Output.Write(csv);

                        Response.Flush();
                        Response.End();

                    }
                }

            }
            }

        }
    }
} 

当我在 SQL 管理工作室中使用查询时,持续时间显示为:00:32:39,但它在生成的 CSV 中显示为 0.0226736111111111。有没有办法解决这个问题?

【问题讨论】:

  • 您是否注意到0.0226736111111111*24*60 等于32.65(或32:39)?
  • 是的,我很确定这是因为格式已更改,从 MM:SS:MS 更改为十进制值。
  • 你能做到TimeSpan.FromDays(0.0226736111111111).ToString()吗?这给了我"00:32:39"

标签: c# sql sql-server excel


【解决方案1】:

需要有人说出来。这段代码显示了热情,但并不复杂。您在一种方法中混合了 UI(复选框)、业务逻辑、数据访问、序列化和 HTTP!而且,可以预见的是,存在问题。您的 SQL 是在字符串文字中串联起来的,并且隐藏在最后的是一个发光的 SQL 注入漏洞。您的序列化代码将逗号转换为分号,会丢失数据并生成无效的 CSV(双引号不加倍)。不使用 stringbuilder 来构造 CSV 很可能会导致性能问题。所有这些陷阱都可以通过使用库、Dapper 或 QueryFirst(免责声明:我写的)进行数据访问、使用 servicestack 进行序列化来避免。

了解您的数据是如何存储的,以及如何以及何时格式化,这确实是程序员的核心能力。通常最好在最后一刻格式化。如果您正在重用 sql 请求,您可能希望在 C# 中进行格式化。由于这个请求只用在这个地方,你可能想直接在 SQL 中格式化。缺点是 C# 不会将您的持续时间视为持续时间。在构建自己的日期时间格式之前尝试并使用内置的日期时间格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多