2012-09-19 2 views
0

로컬 모드에서 실행중인 reportviewer가 있습니다. 단지 개체 목록을 표시하고, 병합 함수 나 계산법을 계산하지 않습니다.ReportViewer의 OutOfMemoryException

우리의 개체는 27 개의 문자열 속성을 가지고 있으며, 필터가 적용되기 전에 데이터베이스에 약 250000 개의 레코드가 있습니다. 그래서 reportViewer가 OutOfMemoryException을 발생시킵니다.

어떻게이 문제를 해결하려면 어떤 아이디어가 있습니까 매김

에 대한 컨트롤을 표시하지 않는 경우에도 보고서 만로드 처음 50 개 기록과 -

Linq에 게으른 로딩은 우리에게 도움이되지 않는다? 필터를 하나만 만들면되는 옵션이 하나뿐이므로 결과 목록이 훨씬 작아집니다.

하지만 더 좋은 방법이 있을까요?

답변

0

작업 예제를 작성할 시간이 없지만 여기에 가능한 해결책의 요지가 있습니다.

(1) 실제로 마크 업에서 ReportViewer를 표시하지 않습니다. 보고서 뷰어가 큰 보고서를 만들 때 전체가 바이트 배열로 메모리에있는 것 같습니다.

(2) 동적과 같이 렌더링 호출 다음을 만들고 :

Viewer.LocalReport.Render(format, "", PageCountMode.Estimate, CreateStream, out warnings); 

(3) CreateStream는 대리인과 같이 인 경우 : 그래서 결과가 파일에 기록됩니다

private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, 
           string mimeType, bool willSeek) 
     { 
      Stream stream = new FileStream(name + "." + fileNameExtension, FileMode.Create); 
      return stream; 
     } 

스트림에. ReportDataSource의이 유형을 사용하여 DataTable의의 크기는 여전히 OOM 예외가 발생할 수 있습니다, 그래서 당신은 DbDataReader에서를 사용하여 데이터를 제공 할 수 있습니다

public ReportDataSource(string name, IEnumerable dataSourceValue); 

그것은 위의 제안에, 당신은 단지에서 전환 할 필요가 가능 DataTable을 DataReader에 연결합니다.