Sollten normale oder zwischengespeicherte Berichte verwendet werden?

Wenn Sie planen, eine Anwendung mit dem Crystal Reports-SDK zu erstellen, wird eine Ihrer wichtigsten Überlegungen darin bestehen, ob normale oder zwischengespeicherte Berichte verwendet werden sollen. Indem Sie die SDK-Grundlagen kennen lernen, die das Zwischenspeichern von Berichten beeinflussen, können Sie leicht die optimale Struktur für Ihr Crystal Reports für Visual Studio-Projekt ermitteln.

Was sind zwischengespeicherte Berichte?

Zwischengespeicherte Berichte sind Berichtobjekte, die im ASP.NET Cache-Objekt gespeichert wurden, um Leistung und Skalierbarkeit zu erhöhen. Crystal Reports bietet ein spezifisches Framework zur Ablage von ReportDocument-Instanzen im Cache. Durch dieses Framework werden alle Berichte, die die IcachedReport-Schnittstelle implementieren, automatisch zwischengespeichert.

Was versteht man unter dem ASP.NET Cache-Objekt?

Berichtobjekte werden sowohl in ASP als auch in ASP.NET in Session- oder Application-Objekte auf dem Webserver eingefügt. Hierfür gibt es zwei Gründe:

  1. Um den Zustand des Berichtobjekts persistent zu speichern, auch wenn Seiten erneut geladen werden.
  2. Um die Skalierbarkeit und Leistung zu verbessern, indem umfangreiche oder langsam zu ladende Berichte in den Serverarbeitsspeicher eingelesen werden.

In ASP.NET wurde eine erweiterte Variante des Application-Objekts mit der Bezeichnung "Cache" eingeführt. Beim Cache-Objekt werden genauso wie beim Application-Objekt einzelne Instanzen eines Berichtobjekts weiterhin persistent gespeichert, damit diese von allen Anwendern gemeinsam genutzt werden können. Cache bietet jedoch ein zusätzliches intelligentes Feature, durch das dateibasierte, schlüsselbasierte oder zeitbasierte Abhängigkeiten gesucht werden. Diese Abhängigkeiten können automatisch ablaufen und sogar Berichtobjekte innerhalb des Caches regenerieren, um den Cacheinhalt immer aktuell zu halten.

NoteAnmerkung

Die Begriffe "Cache-Objekt" und "Cache" sowie "Session-Objekt" und "Session" bzw. "Application-Objekt" und "Application" werden in diesem Dokument variiert, haben jedoch dieselbe Bedeutung. Der Begriff "Objekt" dient nur zur Betonung, dass es sich hierbei um Persistenzobjekte handelt, die im .NET Framework-Speicherbereich auf dem Webserver ausgeführt werden.

Wie werden Berichtobjekte in das ASP.NET Cache-Objekt eingefügt?

Sie können Berichtobjekte auf zwei Weisen in das ASP.NET Cache-Objekt einfügen:

  • Weisen Sie dem Cache-Objekt das Berichtobjekt mit derselben Syntax zu, mit der ein Berichtobjekt einem Session- oder Application-Objekt zugewiesen wird (explizite Zuweisung).
  • Instantiieren Sie eine Version des Berichts, durch die die IcachedReport-Schnittstelle implementiert wird. Die Report Engine sucht jedes Berichtobjekt, durch das diese Schnittstelle implementiert wird und legt dieses Berichtobjekt automatisch im Cache-Objekt ab (implizite Zuweisung).

Was versteht man unter der ICachedReport-Schnittstelle?

Die IcachedReport-Schnittstelle markiert alle Berichtklassen, die ICachedReport die Zusammenarbeit mit dem Crystal Reports-Framework für die Zwischenspeicherung ermöglichen. Dieses angepasste Framework stellt eine Schicht über dem ASP.NET Cache-Objekt bereit, um spezifische Anforderungen an das Zwischenspeichern von Berichten zu erfüllen.

Die ICachedReport-Schnittstelle wird mit Methodensignaturen zur Verfügung gestellt. Sind diese Signaturen in die Berichtklasse implementiert, kann das Framework ermitteln, wie die jeweilige Klasse zwischengespeichert werden soll.

Welche Funktionen zum Zwischenspeichern von Berichten sind beim Einbetten eines Berichts in ein Visual Studio-Projekt verfügbar?

Wenn Sie einen Bericht in einem Visual Studio-Projekt erstellen oder darin importieren, wird der Bericht in das Projekt eingebettet, und es werden automatisch zwei Klassen generiert:

  • Eine Berichtwrapperklasse (mit demselben Namen wie der Bericht).
Diese Wrapperklasse stellt den Bericht im Projekt dar und erbt von ReportDocument. Weitere Informationen finden Sie unter [Sollten eingebettete oder nicht eingebettete Berichte verwendet werden?](ms225520\(v=vs.90\).md).
  • Eine Cache Management Utility-Klasse (namens "Cached[Berichtname]-Klasse").
Diese Cache Management Utility-Klasse ist für die Zwischenspeicherung des eingebetteten Berichts unter Verwendung des ASP.NET Cache-Objekts und des in das Crystal Reports-SDK integrierten Frameworks für die Zwischenspeicherung zuständig.

In der folgenden Tabelle sind die Elemente aufgeführt, die generiert werden, wenn Sie einem Crystal Reports für Visual Studio-Projekt den Bericht "Hierarchical Grouping" (aus dem Verzeichnis "Samples") hinzufügen:

Name
Beschreibung
Hierarchical Grouping.rpt
Der Bericht
Hierarchical_Grouping-Klasse
Die Berichtwrapperklasse
CachedHierarchical_Grouping-Klasse
Die Cache Management Utility-Klasse, die zur Verwaltung der Zwischenspeicherung für die Berichtwrapperklasse verwendet wird

Die Berichtwrapperklasse und die Cache Management Utility-Klasse haben unterschiedliche Aufgaben:

  • Die Berichtwrapperklasse erbt von ReportDocument und hat daher Zugriff auf das vollständige ReportDocument-Objektmodell. Sie ist die Kernklasse, für die zur Interaktion mit dem Bericht programmiert wird.
  • Die Cache Management Utility-Klasse verwaltet und speichert Instanzen der Berichtwrapperklasse im ASP.NET Cache-Objekt. Sie erkennt unterschiedliche Instanzen der Berichtwrapperklasse und verhindert, dass sich solche Instanzen im Cache gegenseitig überschreiben. Beispielsweise werden Unterschiede erkannt, die bei geänderten Parametern und Anmeldeinformationen entstehen. Um dies zu ermöglichen, weist die Klasse jeder eindeutigen Instanz der Berichtwrapperklasse einen eindeutigen Schlüssel zu.
  • Damit die Cache Management Utility-Klasse von den Cachefunktionen des Crystal Reports .NET Frameworks identifiziert werden kann, wird von dieser Klasse die IcachedReport-Schnittstelle implementiert.

Sowohl die Berichtwrapperklasse als auch die Cache Management Utility-Klasse werden in derselben Klassendatei generiert. Um beide Klassen anzeigen zu lassen, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Berichtklassendatei und wählen "Code anzeigen". Den Code für die Berichtwrapperklasse finden Sie oben in der geöffneten Datei und den Code für die Cache Management Utility-Klasse ungefähr ab der Mitte.

NoteAnmerkung

Informationen zum Binden des CrystalReportViewer-Steuerelements an diese Cache Management Utility-Klasse finden Sie unter Binden an eine Klasse zwischengespeicherter eingebetteter Berichte. Um eine eigene Cache Management Utility-Klasse zum Binden an nicht eingebettete Berichte zu erstellen, informieren Sie sich unter Binden an einen in eine Cache Management Utility-Klasse geladenen nicht eingebetteten Bericht.

Wann sollten Berichte zwischengespeichert werden?

Das ASP.NET Cache-Objekt sollte immer nur eine geringe Anzahl von Berichtobjekten enthalten. Die meisten Berichtobjekte weisen eine geringe Mehrbenutzbarkeit auf (d. h., sie werden nicht als freigegebene Ressourcen mit anderen Objekten verwendet). Daher nutzen diese Objekte den Cache äußerst uneffizient. Falls Persistenz erforderlich ist, sollten Sie Berichtobjekte stattdessen im Session-Objekt des Anwenders platzieren.

Platzieren Sie das Berichtobjekt nur dann im ASP.NET Cache-Objekt, wenn der Bericht eine hohe Mehrbenutzbarkeit aufweist. Dies ist besonders wichtig, wenn das Berichtobjekt sehr umfangreich ist oder eine Abfrage derart komplex ist, dass der Datenabruf mehrere Minuten in Anspruch nimmt.

Siehe auch