다음을 통해 공유


캐시 관리 유틸리티 클래스에 로드된 비포함 보고서에 바인딩

개체 모델

이 보고서 바인딩 시나리오에는 ReportDocument가 사용됩니다("ReportDocument 개체 모델을 통한 보고서 바인딩" 참조).

보고서 위치

보고서는 파일 디렉터리에 있습니다.

설명

이 보고서 바인딩 시나리오는 " 캐시된 포함 보고서 클래스에 바인딩 "과 유사합니다. 이 시나리오와의 차이점은 보고서가 포함되지 않는다는 사실입니다. 비포함 보고서에 대한 자세한 내용은 "포함 및 비포함 보고서 비교"를 참조하십시오.

Crystal Reports for Visual Studio에는 ASP.NET 캐시 개체를 통한 보고서 캐싱을 지원하는 두 가지 기능이 있습니다.

  • 캐시하는 각 인스턴스에 대해 고유한 키를 필요로 하는 고유한 매개 변수 또는 로그온 자격 증명이 동일한 보고서에 있는 경우 이를 인식하는 기본 제공 보고서 캐시 관리 프레임워크
  • 보고서 캐시 관리 프레임워크에 대해 보고서 캐시 관리 유틸리티 클래스를 식별하는 ICachedReport 인터페이스

" 캐시된 포함 보고서 클래스에 바인딩 "에서는 보고서를 프로젝트에 포함할 때 자동으로 작성되는 Cached[report name] 클래스에 대해 설명했습니다. 그러나 비포함 보고서를 관리하는 캐시 관리 유틸리티 클래스를 직접 만들 수도 있습니다. 코드 샘플은 아래의 구현 부분을 참조하십시오.

보고서를 캐시하고 캐시 관리 유틸리티 클래스를 사용하는 방법에 대한 자세한 내용은 "일반 및 캐시된 보고서 비교"를 참조하십시오.

캐싱 사용

캐싱은 신중히 관리하지 않을 경우 시스템 리소스를 지나치게 많이 사용할 수 있으므로 사용이 제한되어 있고 한정적입니다. 캐싱 사용 기준에 대한 자세한 내용은 ""공유 수준이 높은" 보고서 캐시"를 참조하십시오.

장점

  • 공유에 특히 적합합니다. 공유 수준이 높고 매개 변수나 로그온 정보가 거의 변경되지 않는 보고서를 저장하는 데 좋습니다.
  • 데이터 액세스를 최적화할 수 있습니다. 공유 수준이 높은 보고서의 크기가 매우 크거나 쿼리가 너무 복잡하여 이를 검색하는 데 몇 분 정도 걸리는 경우, 캐시 관리 유틸리티 클래스로 데이터에 더 빠르게 액세스할 수 있습니다.

단점

  • 서버 부담이 증가합니다. ASP.NET 캐시 개체에 유지되는 보고서로 인해 서버의 메모리 리소스 사용량이 늘어날 수 있습니다.
  • 상태 유지에 어려움이 따릅니다. 캐시에는 보고서 인스턴스의 변경 여부를 확인하고 변경된 보고서 인스턴스를 다시 캐시할 수 있는 특정 종속성이 있습니다. 그러나 데이터베이스가 변경된 경우에는 해당 변경 사항을 반영할 수 있도록 캐시의 보고서 인스턴스가 새로 고쳐지지 않습니다.
  • 리소스를 많이 사용합니다. 보고서에 포함된 매개 변수를 다른 매개 변수 문자열에서 자주 호출하는 경우, 특히 이러한 매개 변수 중 하나가 사용자 ID인 경우에는 보고서를 매번 새로 캐시한다는 의미입니다. 이러한 과정에서 많은 시스템 리소스가 사용됩니다. 보고서의 공유 수준이 높지 않으면 보고서 인스턴스를 세션 개체에 할당해야 합니다. "Session 및 ReportDocument 개체 모델의 상태 유지"를 참조하십시오.

비포함 보고서를 캐시한 다음 CrystalReportViewer 컨트롤에 바인딩하려면

Note참고

이 절차는 "프로젝트 설정"을 통해 생성된 프로젝트에서만 사용할 수 있습니다. 프로젝트 설정에는 이 절차에 필요한 코드 구성 및 특정 네임스페이스 참조가 포함되어 있으므로 해당 구성이 없으면 절차를 완료할 수 없습니다. 따라서 이 절차를 시작하기 전에 먼저 "프로젝트 설정"의 단계를 수행해야 합니다.

  1. General Business 하위 디렉터리에서 World Sales Report.rpt 파일을 찾습니다. 샘플 보고서에 대한 자세한 내용은 "샘플 보고서 디렉터리"를 참조하십시오.

  2. World Sales Report.rpt를 포함하여 전체 파일 디렉터리 경로를 클립보드에 복사합니다.

  3. ConfigureCrystalReports() 메서드("프로젝트 설정"에서 만든 메서드) 내에서 reportPath 문자열 변수를 선언하고 이전 단계에서 복사한 World Sales Report 파일 디렉터리 경로가 포함된 문자열을 할당합니다.

    Dim reportPath As String = _
    "C:\Program Files\Microsoft Visual Studio 9.0\" _
    & "Crystal Reports\Samples\En\Reports\General Business\" _
    & "World Sales Report.rpt"
    
    string reportPath =
    "C:\\Program Files\\Microsoft Visual Studio 9.0\\"
    + "Crystal Reports\\Samples\\En\\Reports\\General Business\\"
    + "World Sales Report.rpt";
    
  4. NonEmbeddedReportCacher 클래스를 선언하여 인스턴스화한 다음 여기에 reportFile 문자열 변수를 전달합니다.

    Note참고

    NonEmbeddedReportCacher 클래스를 만드는 방법에 대한 자세한 내용은 다음 단계 절차를 참조하십시오.

    Dim myNonEmbeddedReportCacher As NonEmbeddedReportCacher = _New NonEmbeddedReportCacher(reportFile)
    
    NonEmbeddedReportCacher nonEmbeddedReportCacher = new NonEmbeddedReportCacher(reportFile);
    
  5. CrystalReportViewer 컨트롤의 ReportSource 속성에 보고서 캐시 관리 유틸리티 클래스 인스턴스를 할당합니다.

``` vb
myCrystalReportViewer.ReportSource = myNonEmbeddedReportCacher
```

``` csharp
crystalReportViewer.ReportSource = nonEmbeddedReportCacher;
```

NonEmbeddedReportCacher 캐시 관리 유틸리티 클래스를 만들려면

  1. 프로젝트에서 NonEmbeddedReportCacher라는 새 클래스를 만듭니다.
``` vb
Public Class NonEmbeddedReportCacher

End Class
```

``` csharp
using System;

namespace MyWebApplication
{
public class NonEmbeddedReportCacher
{
public NonEmbeddedReportCacher()
{
}
}
}
```
  1. ICachedReport 인터페이스를 클래스 시그니처에 추가합니다.

    Public Class NonEmbeddedReportCacher
    Implements ICachedReport
    
    public class NonEmbeddedReportCacher : ICachedReport
    
  2. 클래스 위쪽에 세 개의 "Imports" [Visual Basic] 또는 "using" [C#] 문을 추가합니다.

``` vb
Imports CrystalDecisions.Shared
Imports CrystalDecisions.ReportSource
Imports CrystalDecisions.CrystalReports.Engine
```

``` csharp
using CrystalDecisions.Shared;
using CrystalDecisions.ReportSource;
using CrystalDecisions.CrystalReports.Engine;
```
  1. 클래스 내에서 두 개의 클래스 수준 인스턴스로 reportFileName이라는 문자열 인스턴스와 nonEmbeddedReportDocument라는 ReportDocument 인스턴스를 선언합니다.
``` vb
Private reportFileName As String
Private nonEmbeddedReportDocument As ReportDocument
```

``` csharp
private string reportFileName;
private ReportDocument nonEmbeddedReportDocument;
```
  1. reportFileName 문자열을 사용하도록 생성자를 설정한 다음 생성자 내에서 해당 문자열을 reportFileName 클래스 변수에 할당합니다.

    Public Sub New(ByVal reportFileName As String)
    Me.reportFileName = reportFileName
    End Sub
    
    public NonEmbeddedReportCacher(string reportFileName)
    {
    this.reportFileName = reportFileName;
    }
    

    이후의 나머지 단계에서는 인터페이스에 필요한 다음과 같은 속성이나 메서드를 구현합니다.

    • IsCacheable
    • ShareDBLogonInfo
    • CacheTimeOut
    • CreateReport()
    • GetCustomizedCacheKey(RequestContext request)
  2. IsCacheable 속성을 만듭니다. 이 속성은 True를 반환해야 합니다.

    Public Overridable Property IsCacheable() As Boolean Implements ICachedReport.IsCacheable
    Get
    Return True
    End Get
    Set(ByVal Value As Boolean)
    End Set
    End Property
    
    public virtual Boolean IsCacheable
    {
    get
    {
    return true;
    }
    set
    {
    }
    }
    
  3. ShareDBLogonInfo 속성을 만듭니다. 이 속성은 False를 반환해야 합니다.

    Public Overridable Property ShareDBLogonInfo() As Boolean Implements ICachedReport.ShareDBLogonInfo
    Get
    Return False
    End Get
    Set(ByVal Value As Boolean)
    End Set
    End Property
    
    public virtual Boolean ShareDBLogonInfo
    {
    get
    {
    return false;
    }
    set
    {
    }
    }
    
  4. CacheTimeOut 속성을 만듭니다. 이 속성은 CachedReportConstants 클래스의 상수를 반환합니다.

    Public Overridable Property CacheTimeOut() As TimeSpan Implements ICachedReport.CacheTimeOut
    Get
    Return CachedReportConstants.DEFAULT_TIMEOUT
    End Get
    Set(ByVal Value As TimeSpan)
    End Set
    End Property
    
    public virtual TimeSpan CacheTimeOut
    {
    get
    {
    return CachedReportConstants.DEFAULT_TIMEOUT;
    }
    set
    {
    }
    }
    
  5. CreateReport() 메서드를 만듭니다. 이 메서드는 클래스 수준의 ReportDocument 인스턴스에 로드된 비포함 보고서를 반환합니다.

    Public Overridable Function CreateReport() As ReportDocument Implements ICachedReport.CreateReport
    If nonEmbeddedReportDocument Is Nothing Then
    nonEmbeddedReportDocument = New ReportDocument()
    nonEmbeddedReportDocument.Load(reportFileName)
    End If
    Return nonEmbeddedReportDocument
    End Function
    
    public virtual ReportDocument CreateReport()
    {
    if (nonEmbeddedReportDocument == null)
    {
    nonEmbeddedReportDocument = new ReportDocument();
    nonEmbeddedReportDocument.Load(reportFileName);
    }
    return nonEmbeddedReportDocument;
    }
    
  6. GetCustomizedCacheKey() 메서드를 만들고 null을 반환합니다.

    Note참고

    이 메서드에서 null이 반환되면 Crystal Reports .NET SDK에서 캐시 조회 키 자체를 관리하기 시작합니다. 다른 방법으로, 여기에 고유한 사용자 지정 캐시 키 메서드를 만들어 추가할 수도 있습니다.

    Public Overridable Function GetCustomizedCacheKey(ByVal request As RequestContext) As String Implements ICachedReport.GetCustomizedCacheKey
    Return Nothing
    End Function
    
    public virtual String GetCustomizedCacheKey(RequestContext request)
    {
    return null;
    }
    
  7. 프로젝트를 빌드하고 실행하여 보고서를 확인합니다.

참고 항목