2014-10-01 7 views
1

에서 '개체를 여러 번 처리하지 마십시오'라는 메시지가 표시됩니다. 이에 관한 많은 게시물을 읽었으니이 점을 이해하는 데 도움이 필요합니다.csv 가져 오기 방법

CodeAnalysis는이 방법이 객체를 두 번 폐기하고 있다고 말합니다. 사실, 메서드에있는 두 객체에 대해이 사실을 경고합니다. 당신이 using (var reader = new StreamReader(file.InputStream))를 사용할 필요가 없습니다 이미 독자 객체를 처분

public void SaveCsvData(HttpPostedFileBase file, int vendorId) 
     { 
      var listCsvImport = new List<CsvImport>(); 

      try 
      { 
       using (var reader = new StreamReader(file.InputStream)) 
       using (var csvReader = new CsvHelper.CsvReader(reader)) 
       { 

        int count = 0; 
        while (csvReader.Read()) 
        { 
         ...<snip>... 

         listCsvImport.Add(record); 
        } 
        _db.CsvImports.AddRange(listCsvImport); 
        _db.SaveChanges(); 
       } 
...<snip>... 

      } 
      catch (CsvBadDataException ex) 
      { 
       log.Error("Invalid data in the CSV file, terminating process..."); 
       throw; 
      } 
      catch (Exception ex) 
      { 
       log.Error("Csv import failed, no data was saved.", ex); 
       throw; 
      } 

     } 

감사

+0

'(var reader ... '를 사용하여'{...}'이 누락 되었습니까? – DavidG

+2

이것은 아마도 CsvReader가 독자를 삭제하므로 2 개의 using 문이 필요하지 않기 때문일 수 있습니다. 당신이 게시 한 코드와는 다른 실제 코드를 컴파일한다고 가정합니다. –

+0

@DavidG 아니요, 네스트를 중첩 시키려면 스택 문을 사용하여 스택하는 것이 좋습니다. 문제가 발생하면 모두 순서대로 처리합니다. 그들은 –

답변

2

using (var csvReader = new CsvHelper.CsvReader(reader)) : 한 번 file.InputStream과 한 번 reader 객체 여기

에 대한 내 코드입니다.

+0

첫 줄에서'독자 '를 처분한다고 생각합니까? – DavidG

+2

@DavidG'객체를 여러 번 처리하지 마십시오. '라는 경고가 표시 될 수 있습니다. ? –

+1

오래된 질문/답변, 알아요.하지만 다음 GitHub 문제는 CsvReader가 전달한 데이터를 처리하는 동작을 확인합니다. StreamReader https://github.com/JoshClose/CsvHelper/issues/396 (개인적으로 CsvReader보다는 StreamReader를 처분 할 것입니다. 동시에 두 인스턴스를 인스턴스화하지 않는 한.) – Quails4Eva