2017-02-06 9 views
0
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 。これを修正する方法はありますか?C#生成されたCSVは、SQLデータベースから取得したデータの形式を変更します

+0

'0.0226736111111111 * 24 * 60'は' 32.65'(または '32:39')に等しいことに気付きましたか? – Enigmativity

+0

はい、MM:SS:MSから小数点以下の値にフォーマットが変更されたためです。 –

+0

'TimeSpan.FromDays(0.0226736111111111).ToString()'できますか?それは私に "00:32:39"を与えます。 – Enigmativity

答えて

0

誰かがそれを言う必要があります。このコードは、負荷の熱意とあまり洗練されていないことを示しています。 UI(チェックボックス)、ビジネスロジック、データアクセス、シリアライゼーション、HTTPをの1つのメソッドに混在させました!予想通り、問題があります。あなたのSQLは連結された文字列リテラルにあり、最後には隠されたSQLインジェクションの脆弱性が隠されています。カンマをセミコロンに変換するシリアル化コードはデータを失い、無効なCSV(二重引用符は二重ではありません)が生成されます。 CSVを構築するためにstringbuilderを使用しないと、パフォーマンスの問題が発生する可能性があります。これらすべてのトラップは、ライブラリ、DapperまたはQueryFirst(免責事項:私が書いた)を使用してデータアクセスを避けることができます。

データがどのように格納され、いつどのようにフォーマットされるかを理解することは、実際にはプログラマの中核能力です。最後の瞬間にフォーマットすることはしばしば役に立ちます。 SQLリクエストを再利用している場合は、C#でフォーマットすることができます。このリクエストはこの1か所でのみ使用されるため、SQLで直接書式を設定することをお勧めします。欠点は、C#では期間を期間として扱わないことです。独自のビルド前に、組み込みの日付時刻形式を試してみてください。

関連する問題