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

Speichern von Recordsets in Application-Variablen (Teil II)

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Wie bereits im Teil I der Artikelserie besprochen, gibt es verschiedene Wege, ein Recordset in einer Application Variablen zu speichern.

Man kann das Recordset mit der GetRows Methode in ein Array umwandeln, oder die GetString Methode benutzen um eine Text-Variable mit dem Inhalt des Recordsets zu erhalten. Sowohl Array als auch Text-Variable kann man dann in einer Application Variable speichern.

Mit ADO 2.5 (oder höher) steht eine weitere Möglichkeit offen. Man kann das Stream Objekt benutzen, um das Recordset als XML im Stream Objekt zu speichern. Mit der ReadText Methode des Stream Objektes kann man dann das gesamte XML-Recordset in einer Text-Variablen speichern. Diese Text-Variable wiederrum ist problemlos in einer Application- oder Session-Variable zu speichern.

Anmerkung: Um zu testen, welche ADO Version auf Ihrem Server installiert ist, führen Sie folgendes Visual Basic (Word, Excel, Access) oder VBScript Programm (ASP-Seite, WSH-Script) aus; die gewünschte Information befindet sich dann in der Textvariablen strADOVersion.

Dim conn
Set conn = CreateObject("ADODB.Connection")
strADOVersion = "ADO Version " & conn.Version & " ist installiert."
Set conn = Nothing
...

Weiters können Sie das gratis erhältliche Component Checker Tool benutzen, um zweifelsfrei festzustellen, welche ADO Version auf einem Computer installiert ist.

Um nun aus dem XML-Recordset in Form einer Text-Variablen wieder ein ADO Recordset Objekt zu erhalten, öffen Sie ein Stream Objekt, und schreiben das XML mittles der WriteText Methode in den Stream.

Damit man nach dieser Schreiboperation wieder auf den Inhalt des Stream Objektes zugreifen kann, ist es notwendig, den Stream Cursor wieder auf den Anfang des Stream Inhaltes zu setzen - dies geschieht durch Zuweisung des Wertes 0 zur Position Eigenschaft des Streams.

Wie die oben beschriebenen Operationen in einem VBScript Programm unter ASP aussehen können, zeigt das folgende Skript:

<%
Dim rs, conn, stream, strRsXML 
Set conn = CreateObject("ADODB.Connection")

' Oeffnen einer Connection zur Access Northwind Datenbank
'  mit dem OLE DB Provider fuer Jet 4.0
conn.open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  "Data Source=E:\Program Files\Microsoft Office\" & _
  "Office\Samples\Northwind.mdb;User ID=admin;Password=;"

Response.Write "ADO-Version: " & conn.Version & "<br><br>"
' Pruefen der ADO/MDAC-Version
' Stream Objekt sowie Save Methode des Recordset Objektes erst ab 
'   ADO Version 2.5 verfuegbar
If (conn.Version) >= "2.5" Then
  ' ADO Version 2.5 oder hoeher

  ' Begin des Schreibens des Recordsets in die Application Variable
  Set rs = CreateObject("ADODB.Recordset")
  Set stream = CreateObject("ADODB.Stream")
  ' Recordset oeffnen und mit Daten fuellen
  rs.Open "SELECT EmployeeID, LastName, FirstName FROM Employees", conn

  ' Recordset in Stream Objekt als XML speichern
  rs.Save stream, 1  ' 1 = adPersistXML

  ' Als XML gespeichertes Recordset aus dem Stream Objekt auslesen
  '  und als String (Zeichenkette) in der Variablen strRsXML speichern
  strRsXML = stream.ReadText(-1) ' -1 = adReadAll
  
  ' Recordset und Connection Objekt werden nun nicht mehr gebraucht
  ' Stream Objekt wird nicht mehr benoetigt
  rs.Close
  Set rs = nothing
  conn.close
  Set conn = Nothing
  stream.Close
  Set stream = Nothing
  
  ' Speichern des als XML-String formatierten Recordsets 
  ' in einer Application Variablen
  Application.Lock
  Application("AspAktuell_RsXML") = strRsXML
  Application.UnLock
  
  ' Ausgeben des XML:
  Response.Write Replace(Server.HTMLEncode(strRsXML),VbCrLf,"<br>"&VbCrLf)
  Response.Write "<br><br>" & VbCrLf
  strRsXML = ""
  
  ' Ende des Schreibens des Recordsets in die Application Variable


  ' Begin des Auslesens des Recordsets aus der Application Variable
  
  ' Auslesen des XML-Recordsets aus der Application Variablen 
  '  und speichern in einem Disconnected Recordset

  ' Disconnected Recordset rs anlegen aber nicht oeffnen
  Set rs = CreateObject ("ADODB.Recordset")
  rs.CursorLocation = 3  ' 3 = adUseClient
  rs.LockType = 4      ' 4 = adLockBatchOptimistic
  rs.CursorType = 3    ' 3 = adOpenStatic

  ' Auslesen des XML-Strings aus der Application Variablen
  strRsXML = Application("AspAktuell_RsXML")

  ' Stream Object anlegen und oeffnen
  Set stream = CreateObject("ADODB.Stream")
  stream.open
  
  ' XML-String in Stream Objekt schreiben
  stream.WriteText strRsXML, 0  ' 0 = adWriteChar
  
  ' Der Cursor des Stream Objektes ist am Ende des Datenstromes,
  ' daher Cursor auf Anfang des Datenstromes setzen
  stream.Position = 0
  
  ' Oeffnen des Disconnected Recordset (client-seitig, statisch, 
  '  Daten koennen gelesen und veraendert werden), Datenquelle ist
  '  das Stream Objekt
  rs.Open stream
  Set rs.ActiveConnection = Nothing ' Nicht explicit notwendig, 
              ' hier nur der Vollstaendigkeit halber

  ' Stream Objekt wird nicht mehr benoetigt
  stream.close
  Set stream = Nothing

  ' Beispiel, dass das Disconnected Recordset veraendert werden kann:
  ' Erster Datensatz veraendern
  rs("LastName") = "Familienname"
  rs("FirstName") = "Vorname"
  
  ' Alle Datensaetze anzeigen
  While not rs.EOF
    Response.Write rs("EmployeeID") & " " & rs("LastName")
    Response.Write rs("FirstName") & "<br>" & VbCrLf
    rs.MoveNext
  Wend

  ' Nach dem Aendern kann das Recordset Objekt wieder als XML
  '  in einem Stream Objekt gespeichert werden.
  '  Aus dem Stream Objekt kann das XML als String (Text) in einer 
  '  String Variablen (auch Application Variablen) gespeichert werden
  
  ' Recordset wird nicht mehr benoetigt
  rs.Close
  Set rs = Nothing
Else
  ' ADO Version 2.1 oder niedriger
  conn.Close
  Set conn = Nothing
  Response.Write "Nur mit ADO/MDAC Version 2.5 "
  Response.Write "oder höher ausführbar...<br>" & VbCrLf
End If
%>

Warum soll man sich diese Arbeit überhaupt machen - das Speichern eines Recordsets als XML? Der Grund ist einfach: Geschwindigkeit. Das vorgestellte Verfahren ist zwar nicht so schnell wie die von MS aus Windows 2000 wieder entfernte IMDB (InMemory Database), allerdings zeigt sich ein sehr deutlicher Geschwindigkeitsgewinn gegenüber einem Datenbankzugriff.

This printed page brought to you by AlphaSierraPapa

Download des Codes

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

Verwandte Artikel

Einsatz des Recordset Objektes als Multifunktionaler Datenspeicher
http:/www.aspheute.com/artikel/20000516.htm
Sonderzeichen korrekt grabben mit XmlHttp
http:/www.aspheute.com/artikel/20011113.htm
Speichern von Recordsets in Application-Variablen (Teil I)
http:/www.aspheute.com/artikel/20000420.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.