Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Speichern von Recordsets in Application-Variablen (Teil I)

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

In einer ASP Anwendung kann es von Vorteil sein, Datenbankwerte, die nicht (oder nur sehr selten) verändert werden, in einer Application Variablen zu speichern. Auf solch' eine Application Variable kann dann jedes ASP-Skript der selben Website zugreifen (solang' es besondere Umstände nicht daran hindern).

Application-Variablen werden wie folgt gesetzt und gelesen:

' Application Variable setzen:
Application.Lock
Application("VariablenName") = VariablenWert
Application.UnLock

' Application Variable auslesen:
Variable = Application("VariablenName")

Den Wert einer Application-Variable setzt man am besten in der Unterroutine (engl. Sub) Application_OnStart der Global.asa. Die Global.asa ist eine Text Datei (ähnlich einer .asp-Datei), die im Root-Verzeichnis der Website liegt. In der Global.asa stehen die Definitionen der Unterroutinen Application_OnStart und Application_OnEnd, die beim Starten und Beenden der Website-Applikation abgearbeitet werden.

Ausserdem kann die Global.asa noch die Unterroutinen Session_OnStart und Session_OnEnd enthalten, die beim Starten und Beenden einer User-Session in der Website-Applikation ausgeführt werden.

Das Grundgerüst der Global.asa ist wie folgt:

<SCRIPT LANGUAGE="VBScript" RUNAT="SERVER">
Sub Application_OnStart
	' Wird beim Starten der Website Applikation ausgeführt
	' Hier werden normalerweise Application-Variablen gesetzt
	Application("Variablenname")= VariablenWert
	...
End Sub

Sub Application_OnEnd
	' Wird beim Beenden der Website Applikation ausgeführt
	...
End Sub

Sub Session_OnStart
	' Wird beim Starten einer Session ausgeführt
	...
End Sub

Sub Session_OnEnd
	' Wird beim Beenden einer Session ausgeführt
	...
End Sub
</SCRIPT>

Welche Möglichkeiten hat man, wenn man ein Recordset in einer Application-Variablen speichern will? Man könnte ein Disconnected Recordset nehmen (das keine permanente Datenbank Verbindung braucht) und es in einer Application-Variablen speichern - Dies war unter IIS 4.0 möglich, wird jedoch auf einem IIS 5.0 (Windows 2000) unter Ausgabe einer Fehlermeldung verweigert.

Anmerkung: Auch auf einer IIS 4.0 ASP-Applikation war es nicht ratsam ein Recordset Objekt (oder irgendein anderes Objekt) in einer Application-Variablen zu speichern, da jede ASP-Seite, die das Recordset dann benutzte, im selben "Thread"-Kontext wie das Recordset Objekt laufen mußte. Dies hatte vereinfacht gesagt zur Folge, daß der Webserver seine Kapazitäten nicht ausschöpfen konnte, da alle ASP-Skripts nur einzeln nacheinander abgearbeitet werden können. Da das Abarbeiten einer ASP-Seite, durch die Client-Server Architektur des Internetes bedingt, durchaus mehrere Sekunden dauern konnte, war eine beträchtliche Performance Einbuße schon bei mittelgroßen Internet-Applikationen zu beobachten.

Eine weitere Möglichkeit den Recordset Inhalt in einer Application-Variablen zu speichern ist, das Recordset in ein Array umzuwandeln, um dann dieses Array in einer Application-Variablen zu speichern. Dies läßt sich einfach mit der GetRows Methode des Recordset Objektes verwirklichen. Dabei werden die Daten in einem zwei-dimensionalen Array mit 0-basierendem Index gespeichert (erste Dimension ist Feld, zweite Dimension die Datensatznummer):

<%
...
rs.MoveFirst
arrRecordset = rs.GetRows()

Application.Lock
Application("RecordsetArray")= arrRecordset
Application.UnLock

' Alle Datensaetze des Arrays durchlaufen
For intI = 0 to UBound(arrRecordset, 2)
	strErstesFeld = arrRecordset(0,intI)
	strZweitesFeld = arrRecordset(1,intI)
	...
Next
%>

Einen anderen Weg beschreitet man, wenn man den Inhalt des Recordsets unter Verwendung der GetString Methode in einer String (Text) Variablen speichert. Diese Text Variable kann dann in einer Application Variablen gespeichert und bei Bedarf wieder ausgelesen werden. Zum Auslesen des Recordset Inhaltes aus der Text-Variablen ist es oft hilfreich, den Text in ein Array überzuführen, und dann die Daten aus dem Array zu lesen:

<%
' Recordset in String Speichern
' Als Begrenzungszeichen fuer Records (oder Rows) wird die 
'   Zeilenschaltung (Konstante VbCrLf in VBScript),  
'   und zur Begrenzung der Salten (oder Columns) 
'   das "|"-Zeichen verwendet
strRecordsetInhalt = rs.GetString(2, , "|", VbCrLf, "(null)")   
     ' 2 = adClipString

' Speichern des Recordset Inhaltes als String 
'   in einer Application Variablen
Application.Lock
Application("RecordsetString")= strRecordsetInhalt
Application.UnLock

' Auslesen der Daten aus dem String durch
'   Ueberfuehren in ein Array
arrRecords = Split(strRecordsetInhalt, VbCrLf)
For intI = 0 to UBound(arrRecords) - 1 
  Response.Write intI+1 & ". Datensatz:<br>" & VbCrLf
  arrFields = Split(arrRecords(intI), "|")
  For intK = 0 to UBound(arrFields)
    Response.Write "  " & intK+1 & ". Feld = " 
    Response.Write arrFields(intK) & "<br>" & VbCrLf
  Next
Next
%>

Weitaus komfortabler als ein Recordset in Form eines Arrays oder Strings mit Begrenzungszeichen zu speichern ist es jedoch, wenn man ein Recordset als XML-String in einer Application Variablen speichert.

Dies hat den Vorteil, daß man das XML wieder einfach in ein Recordset Objekt umwandeln kann. Mit diesem Recordset Objekt kann man natürlich alle Recordset Operationen ausführen, den Inhalt lesen, das Recordset sortieren, oder nach bestimmten Werten suchen.

Weiters kann man das Recordset ändern, in einen XML-String überführen, und den XML-String wieder in die Application Variable zurückschreiben. Wie dies im Detail funktioniert lesen Sie in Teil II.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000420.zip

Verwandte Artikel

Global.asa: Verwendung, Events und Probleme
http:/www.aspheute.com/artikel/20001018.htm
Speichern von Recordsets in Application-Variablen (Teil II)
http:/www.aspheute.com/artikel/20000425.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.