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!