2016-06-06 11 views
0

Я пишу некоторые данные csv в ответ http. Эти данные выводятся в таблицу данных из базы данных, а затем записываются в контент ответа HTTP с использованием streamwriter. Проблема заключается в том, что файл CSV, загруженный с клиентской стороны, не содержит всех данных. Он всегда пропускает некоторые данные в конце файла. Ниже приведен фрагмент кода:Данные CSV, записанные в http-ответ от таблицы данных, теряются в C#

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()); 
} 

Я пробовал много вещей, но ничего не работало. Может кто-то помочь. Заранее спасибо.

+0

Проверьте статус http. Вы должны получить 200 Done в конце данных. Вы можете обнюхать данные с помощью Fiddler и убедиться, что происходит 200 Done. Общая проблема, которую каждый имеет, - это значение по умолчанию для WebRequest для http 1.1, которое не работает в Net Library. Вам может потребоваться изменить запрос на http 1.0, используя следующую команду: request.ProtocolVersion = HttpVersion.Version10; – jdweng

+1

Каков ваш ответ? Если false, вам нужно добавить Response.Flush() перед вызовом Response.End(). – RamblinRose

+0

Если все данные правильно написаны, проверьте, что если вы открываете Excel в excel, и если у вас слишком много строк, которые excel не может обрабатывать (в зависимости от версии), попробуйте открыть его в блокноте или блокноте ++. – par

ответ

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

Спасибо @Alper. Пробовал это, и он улучшил результат, добавив еще несколько строк, которые ранее не отображались ... но все же CSV не несет всех данных, которые ему нужны. Это всего лишь несколько строк в конце. –

+0

Кроме того, я убедился, что результат StringBuilder имеет все данные прямо перед Response.Write (result.ToString()); Итак, теперь я уверен, что проблема связана с Response.Write (result.ToString()); ... как-то он пропускает некоторые данные в конце при записи в ответ –