2016-06-06 13 views
0

Ich schreibe einige CSV-Daten in HTTP-Antwort. Diese Daten werden von der Datenbank in eine Datentabelle geladen und dann unter Verwendung von Streamwriter in den HTTP-Response-Inhalt geschrieben. Problem ist, dass CSV-Datei heruntergeladen auf der Clientseite nicht alle Daten enthält. Es fehlen immer einige Daten am Ende der Datei. Unten ist das Code-Schnipsel:CSV-Daten in HTTP-Antwort aus Datentabelle geschrieben ist in C verloren #

System.Web.HttpResponse Response 

Response.AddHeader("content-disposition","attachment; filename=Results.csv"); 
Response.AddHeader("content-type","text/plain"); 

writeCsvDataStream_ss(new StreamWriter(Response.OutputStream), dt); 
Response.End(); 

private void writeCsvDataStream_ss(StreamWriter Response, DataTable myDT) 
{ 
    StringBuilder result = new StringBuilder(); 
    if (myDT.Rows.Count == 0) 
    { 
     Response.Write("No Data available for selected ESIID"); 
     Response.Flush(); 
     return; 
    } 
    for (int i = 0; i < myDT.Columns.Count; i++) 
    { result.Append(myDT.Columns[i].ColumnName); 
     result.Append(i == myDT.Columns.Count - 1 ? "\n" : ","); 
    } 
    foreach (DataRow row in myDT.Rows) 
    { 
     for (int i = 0; i < myDT.Columns.Count; i++) 
     { result.Append(row[i].ToString()); 
      result.Append(i == myDT.Columns.Count - 1 ? "\n" : ","); 
     } 
    } 
    Response.Write(result.ToString()); 
} 

Ich habe viele Dinge ausprobiert, aber nichts hat funktioniert. Könnte jemand bitte helfen. Vielen Dank im Voraus.

+0

Überprüfen Sie den http-Status. Sie sollten 200 am Ende der Daten fertig bekommen. Sie können die Daten mit Fiddler schnüffeln und überprüfen, ob 200 Done auftritt. Das allgemeine Problem, das jeder hat, ist WebRequest standardmäßig auf http 1.1, die nicht funktioniert in Net Library. Unter Umständen müssen Sie die Anforderung in http 1.0 ändern, indem Sie Folgendes ausführen: request.ProtocolVersion = HttpVersion.Version10; – jdweng

+1

Wie ist Ihr Response.Buffer eingestellt? Wenn false, müssen Sie vor dem Aufruf von Response.End() eine Response.Flush() hinzufügen. – RamblinRose

+0

Wenn alle Daten ordnungsgemäß geschrieben werden, überprüfen Sie, ob Sie Excel in Excel öffnen und wenn Sie zu viele Zeilen haben, die Excel nicht behandeln kann (je nach Version), versuchen Sie, es in Notepad oder Editor zu öffnen ++ – par

Antwort

0
private void writeCsvDataStream_ss(StreamWriter Response, DataTable dt) 
{ 
    StringBuilder sbCsv ; 
    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
      sbCsv = new StringBuilder(1024); 
      for (int j = 0; j < dt.Columns.Count; j++) 
      { 
       sbCsv.Append(dt.Rows[i][j] + ";"); 
      } 
      sbCsv.Append(Environment.NewLine); 
      Response.Write(sbCsv.ToString()); 
      if (i % 1000) == 0) 
       Response.Flush(); 
     } 
} 
+0

Danke @Alper. Versuchte dies und es verbesserte das Ergebnis, indem es einige mehr Reihen hinzufügte, die nicht früher auftauchten ... aber dennoch trägt CSV nicht alle Daten, die es sollte. Es sind nur noch ein paar Zeilen am Ende kurz. –

+0

Ich habe auch sichergestellt, dass StringBuilder Ergebnis alle Daten direkt vor Response.Write (result.ToString()) hat; Also, jetzt bin ich sicher, dass das Problem mit Response.Write (result.ToString()); ... irgendwie werden einige Daten am Ende weggelassen, während in die Antwort geschrieben wird –