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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Speichern von Recordsets in Application-Variablen (Teil II)

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Einsatz des Recordset Objektes als Multifunktionaler Datenspeicher
Sonderzeichen korrekt grabben mit XmlHttp
Speichern von Recordsets in Application-Variablen (Teil I)

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.