Speichern von Recordsets in Application-Variablen (Teil II)
Geschrieben von: Christian Koller 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 CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Einsatz des Recordset Objektes als Multifunktionaler Datenspeicher 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.
©2000-2006 AspHeute.com |