DevTrain

Autor: Bernhard Elbl

Das Recordset in ein Array legen

Manchmal besteht der Bedarf ein Recordset in ein Array zu schreiben.
Wie kann man dafür wiederverwendbaren Code programmieren? Man könnte alles in eine Prozedur schreiben. Also Instantiieren der Objekte, öffnen der Connection usw... Zusätzlich kommt es zu einer größeren Argumentenliste(Datenbank-Parameter...). Wenn ich dann noch auf einer Seite mehrere Arrays mit den gleichen oder anderen Werten füllen will, wird diese Prozedur wohl kaum noch irgendwie im Sinne der Performance stehen! Was liegt also näher als das ganze in eine Klasse zu packen?

Was für Eigenschaften und Methoden muss die Klasse haben?
Die benötigt ...

den Connection-String für den Zugang zur DB(hier über das ADO-Modell gelöst),
den SQL-String, um bestimmte Daten aus der DB zu holen und
den ArrayNamen, indem das Recordset hinterlegt wird
Die gibt Ihnen ...
das gefüllte Array (was sonst :-)) und
die Zeilenanzahl

Also wird der Aufruf der Klasse so aussehen...
<%@ Language=VBScript %>
<!--#include file="RSToArray.asp"-->
<%
Dim MyRSArray   '--- dieses Array wird mit dem rs gefüllt werden
Set oMyClass = New RSToArray    '--- Instanz zur Klasse RSToArray
'--- öffnen der Connection zur DB mit übergabe des Connection-Strings
oMyClass.ConnOpen "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:Inetpubwwwrootdeveloperdbaupload.mdb;"
oMyClass.SQLString = "SELECT * from artikel"  '--- SQL-String übergeben
oMyClass.RSArrayMaker MyRSArray   '--- MyRSArray wird mit RS-Daten gefüllt
ZeilenAnzahl = oMyClass.ZeilenAnzahl   '--- ZeilenAnzahl in Variable schreiben
'--- hier könnte man weitere Arrays füllen
'oMyClass.SQLString = "SELECT * from aspupload"
'oMyClass.RSArrayMaker MyNochEinArray
Set oMyClass = Nothing '--- Zerstören der Klasse
%>

Die Daten befinden sich jetzt also in dem Array "MyRSArray". Dieses setzt sich so zusammen:
MyRSArray(x,y)
x = SpaltenAnzahl
y = ZeilenAnzahl
Jetzt kann ich das komplette Array z.B. in einer Tabelle ausgeben. Und das geht so...
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Response.Write ZeilenAnzahl
Response.Write "<table>"
for x = 0 to ZeilenAnzahl-1
 Response.Write "<tr>"
 for i = 0 to ubound(MyRSArray)
  Response.Write "<td>" & MyRSArray(i,x) & "</td>"
 next
 Response.Write "</tr>"
next
Response.Write "<table>"
%>
</BODY>
</HTML>

Und natürlich der Aufbau der Klasse
<%
Class RSToArray
 Private conn  '--- ADODB.Connection-Object
 Private rs   '--- ADODB.Recordset-Object
 Private SQLStr   '--- der SQL-String
 Private varAZ   '--- die ZeilenAnzahl
 Private Sub Class_Initialize
  ConnStr = ""
  SQLStr = ""
  '--- Objekte werden instantiiert
  Set conn = Server.CreateObject("ADODB.Connection")
  Set rs = Server.CreateObject("ADODB.Recordset")
 End Sub
 Private Sub Class_Terminate
  '--- Objekte werden zerstört
  Set conn = Nothing
  Set rs = nothing
 End Sub
 
 '--- Öffnet die Connection zur DB
 Public Sub ConnOpen(ConnString)
  conn.Open ConnString
 End Sub
 '--- Schliesst die Connection zur DB
 Public Sub ConnClose
  conn.Close
 End Sub
 
 '--- Entgegennahme des SQLStrings
 Public Property Let SQLString(Par2)
  SQLStr = Par2
 End Property
 
 ' --- füllt das Array, dieses wird mit ByRef zurückgeben
 Public Sub RSArrayMaker(ByRef arrRS)
  rs.Open SQLStr, conn
  If Not rs.EOF And Not rs.BOF Then   '--- Überprüfen ob RS leer ist
   AnzahlSpalten = rs.Fields.Count - 1
   AnzahlZeilen = 0
   ReDim arrRS(AnzahlSpalten, AnzahlZeilen)
   Do Until rs.EOF
    '--- Array-Grösse anpassen
    ReDim Preserve arrRS(AnzahlSpalten, AnzahlZeilen)
    For i = 0 to AnzahlSpalten
     arrRS(i,AnzahlZeilen) = rs.Fields(i)
    Next
    AnzahlZeilen = AnzahlZeilen + 1
    rs.MoveNext
   Loop
  End If
  rs.Close
  
  varAZ = AnzahlZeilen
 End Sub
 
 '--- ZeilenAnzahl wird zurückgeben
 Public Property Get ZeilenAnzahl
  ZeilenAnzahl = varAZ
 End Property
End Class
%>


Unten steht der komplette Code zum Download bereit. Viel Spass!


Erfasst am: 21.08.2001 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=524
© Copyright 2003 ppedv AG - http://www.ppedv.de