2017-12-07 3 views
1

ユーザーがデータベースからCSV形式でデータをダウンロードできるようにするASP.NETページを作成しようとしています。コードの中にある以下のコードを書いて、ボタンをクリックして実行します。ここで私が書いたものです:CSVをResponse.OutputStreamに書き出すと、HTMLも書き出されます

private void RunBackup() 
    { 
    Button1.Enabled = false; 

    Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "attachment; filename=backup.csv"); 

    try 
    { 
     using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString)) 
     using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8)) 
     { 
      var queryString = "SELECT * FROM [Data] WHERE [ID] = @id"; 
      SqlCommand command = new SqlCommand(queryString, connection); 
      command.Parameters.Add("@id", SqlDbType.Int).Value = userId; 
      connection.Open(); 
      SqlDataReader reader = command.ExecuteReader(); 

      // Write header row. 
      for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) 
      { 
       if(columnCounter > 0) 
       { 
        writer.Write(separator); 
       } 
       writer.Write(reader.GetName(columnCounter)); 
      } 
      writer.WriteLine(string.Empty); 

      // Write out the data. 
      while (reader.Read()) 
      { 
       // Write out the column. 
       for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) 
       { 
        if (columnCounter > 0) 
        { 
         writer.Write(separator); 
        } 
        writer.Write(reader.GetValue(columnCounter).ToString().Replace(",", ";").Replace("\"", " ")); 
       } 
       writer.WriteLine(string.Empty); 
      } 

      HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     } 
    } 
    catch(Exception e) 
    { 

    } 
    finally 
    { 
     Button1.Enabled = true; 
    } 

それは私がCSVがSQLデータを含むファイルを取得、私はまた得るかだけではなく、事実を除いて、素晴らしい作品 - ファイルの最後に - ページのHTML。私はそれがResponseヘッダーまたはResponse.OutputStreamへの出力と関係があると思われますが、何をしているのか分かりません。

私は正しい方向を指していると思います。

+0

正確に何をしたいですか?私はほとんどCSVに報告書を書いていますが、長年にわたって優れています。 –

答えて

0

デフォルトでは、ASP.NetはフォームをHtmlとしてレンダリングし、反対に指示しない限りフォームをクライアントに返します。そのため、ダウンロードしたファイルにHtmlページが表示されます。

RunBackup()メソッドの最後にこのコードを追加します。

Response.End(); 

これにより、ファイルに追加するものが増えなくなります。

コードには、パイプライン内の他のイベントを正常にスキップして終了要求を準備するための重要な要素であるCompleteRequest()があります。アプリケーションが出力をバッファリングするように設定されている場合、Response.Flush();追加することができます。

関連する問題