ASP kann Ihre dynamischen Webseiten schnell ausführen, aber Sie können sie auch schneller ausführen, indem Sie Code und Datenbankverbindungen komprimieren. Dies ist ein ausführlicher Artikel darüber, wie Sie Code und ASP-Funktionen optimieren, um die schnellste Ausführungsgeschwindigkeit zu erzielen. Für einen ungeduldigen Benutzer könnte jede Verzögerung zwischen dem Drücken einer Benutzertaste und dem Erscheinen des Ergebnisses auf seinem Bildschirm bedeuten, dass er eine andere Website durchsucht? Wenn Sie über eine kommerzielle Website verfügen, könnte dies bedeuten, dass Ihnen potenzielle Umsätze entgehen.
Wir haben keine Möglichkeit, die Bandbreite des Benutzers zu kontrollieren, aber wir erzielen die beste Leistung, indem wir die ASP-Site optimieren. Die meisten potenziellen Leistungsverbesserungen erfolgen durch Systemänderungen und nicht durch Verschärfung des Codes. Eine unangemessene Idee besteht darin, den Systemadministrator zu bitten, das System zu aktualisieren, sobald Probleme mit der Systemeffizienz auftreten.
Welche Faktoren könnten sich zunächst auf die Leistung von Asp auswirken? Leider gibt es viele Faktoren? Dies sind nur einige davon:
verfügbare Bandbreite
Die Geschwindigkeit des Prozessors und anderer Hardware auf dem Server
Andere Programme, die auf dem Server laufen (wie diese OpenGL-Bildschirmschoner!)
Datenbankverbindungsmodus, Verbindungspool, Datenbanksystem selbst (z. B. Oracle ist besser als SQL Server, SQL Server ist besser als Access)
verwendete Sprache
Gespeicherte Prozeduren sind besser als zeilenbasierte SQL-Anweisungen
Verwendung kompilierter Komponenten anstelle von VB oder JavaScript, gute ASP-Programmiererfahrung, z. B. Fehlerbehandlung usw.
Einige der oben genannten Faktoren sind Entwicklern mit Kenntnissen und Erfahrungen mit IIS möglicherweise bereits häufig aufgefallen, andere können für sie jedoch sehr komplexe Probleme darstellen. In diesem Artikel werden wir versuchen, alle Faktoren zu erklären, die die Leistung von Asp* beeinflussen, und einen Blick auf die wichtigsten Dinge werfen, die in den wenigen Millisekunden, die wir einsparen, erledigt werden können.
ASP-Skriptgröße
Ist Ihre Skriptseite (und andere Seiten) länger als nötig? Dies verringert die Leistung von Asp*, sobald es ausgeführt wird. ASP-Skripte sind nützlich, um Informationen abzurufen und die Ausgabe zu formatieren. Skripte werden jedoch auch Zeile für Zeile interpretiert. Je länger Ihr Skript also ist, desto länger dauert die Ausführung.
Was können Sie tun, um die Länge Ihres Skripts zu reduzieren, wenn es sehr umfangreich ist? Hier einige Vorschläge:
Können Sie sie über fortgeschrittene Windows-Programmiersprachen oder entsprechende COM-Schnittstellensprachen in serverseitige Komponenten, also in VB-DLLs, oder in unkompilierte Komponenten umwandeln? Und registrieren Sie sie auf der Serverseite. Eine Kurzanleitung finden Sie unter
Gefunden unter http://www.webdevelopersjournal.com/articles/activex_for_asp.html. Das Kompilieren einer gut geschriebenen ActiveX-Komponente kann nicht nur die Leistung erheblich verbessern, sondern auch Ihre Software (Skripte) schützen, insbesondere wenn Sie Ihre ASP-Site auf einem Drittanbieter-Host veröffentlichen.
Da Skripte Zeile für Zeile interpretiert werden, kann die Leistung verbessert werden, indem redundante Skripte entfernt oder effizientere Skripte erstellt werden. Wenn Sie Hunderte von Codezeilen in einer einzigen ASP-Datei haben, können Sie auf diese Weise wahrscheinlich Benutzer, Transaktionen und Datendienste gut trennen. Wenn Sie dies tun, finden Sie möglicherweise sogar redundanten Code: Wenn Sie mehrere Tabellen ausgeben müssen, können Sie eine allgemeine Funktion zur Ausgabe einer Tabelle schreiben und diese einfach mehrmals aufrufen.
Wenn wir über die Größe von Asp-Skripten sprechen, müssen wir die Größe der enthaltenen Dateien erwähnen. Wenn Sie eine Include-Datei verwenden, wird die gesamte Include-Datei geladen. Wenn die Include-Datei eingebunden wird, entspricht dies dem Schreiben dieses Teils des Codes in die ASP-Datei selbst. Wenn Sie daher viele gängige Methoden und Definitionen in einer langen Include-Datei definieren, beachten Sie, dass beim Einbinden der Datei unabhängig davon, ob Sie jede darin enthaltene Methode oder Definition verwenden möchten, diese in die gesamte geladene Datei einbezogen wird. ASP speichert den gesamten Erweiterungscode, was die Sucheffizienz verringert. In diesem Fall muss die enthaltene Datei in kleinere, modulare Dateien aufgeteilt werden. Beachten Sie außerdem, dass Include-Dateien vom Server als separate Seitenanforderungen behandelt werden und dass sich die Verwendung zu vieler Include-Dateien auf die Downloadzeiten auswirken kann.
<!-- #include file=Header.asp -->
<!-- #include file=Footer.asp -->
<SCRIPT language=vbscript runat=server>
Sub Main()
WriteHeader
WriteBody
WriteFooter
Sub beenden
SubWriteBody()
...
Sub beenden
Main?'Rufen Sie die Prozedur Main auf
</SCRIPT>
Wenn Ihr Skript lang ist, verwenden Sie Response.IsClientConnected. Dies bedeutet, dass Ihre Server-CPU das Warten in einer Schleife vermeiden kann, wenn der Client nicht mehr mit dem Server verbunden ist.
<%
'Überprüfen Sie, ob der Client noch verbunden ist
Wenn nicht Response.IsClientConnected, dann
„Immer noch verbunden, Handler.“
Anders
'trennen
Ende wenn
%>
Durchmischung von ASP und HTML
Macht das jeder? Wenn wir die Tabelle ausgeben, konvertieren wir zwischen ASP- und HTML-Code, was eine schlechte Angewohnheit ist. Zum Beispiel:
<HTML>
<KÖRPER>
<%
Setze MyConn = Server.CreateObject(ADODB.Connection)
MdbFilePath = Server.MapPath(sample.mdb)
MyConn.Open Driver={Microsoft Access Driver (*.mdb)}; DBQ= & MdbFilePath & ;
SQL_query = SELECT * FROM Friends
Setze RS = MyConn.Execute(SQL_query)
WÄHREND NICHT RS.EOF
%>
<LI><%=RS(Name)%>: <A HREF=>Homepage</A>
<%
RS.MoveNext
WENDE
%>
</KÖRPER>
</HTML>
Ein weiteres häufiges Beispiel ist die Verwendung einer IF-Anweisung:
<%
Wenn nicht, Sitzung (DBOpen), dann
%>
<H1>Datenbank nicht verbunden</H1>
<%
Anders
%>
<H1>Datenbank geöffnet</H1>
<%
Ende wenn
%>
In diesen Fällen kann die Skriptleistung verbessert werden, indem das serverseitige Skript gemeinsam geschrieben und Response.write zum Generieren des HTML-Codes verwendet wird. Zum Beispiel:
<%
Wenn nicht Sitzung (DBOpen), dann
Response.Write <H1>Datenbank nicht verbunden</H1>
Anders
Response.Write <H1>Datenbank geöffnet</H1>
Ende wenn
%>
Bei großen Skripten und vielen Skripten werden Sie Leistungsverbesserungen feststellen. Beachten Sie, dass die Verwendung von <%-Tags so weit wie möglich vermieden wird, damit ASP bei der Ausführung des Skripts den ASCII-Zeichencode nicht berechnen muss.
Sitzungsstatus
Es besteht kein Zweifel, dass die Fähigkeit, einen bestimmten Zustand über die Sitzung aufrechtzuerhalten, eine sehr leistungsstarke Funktion in ASP ist. Allerdings kann es Ihre* Leistung beeinträchtigen. Offensichtlich wird die Skalierbarkeit Ihrer Website zu einem weiteren Problem, wenn Sie die Verwendung von Sitzungen einschränken. Allerdings verbrauchen Sitzungen Serverressourcen für jeden Benutzer.
Was ist, wenn Sie keine Sitzungsvariablen verwenden oder dies auch nicht tun müssen? Ist die Verwendung versteckter Formularfelder, das Speichern von Daten in der Datenbank und Abfragezeichenfolgen der Trick? Daher sollten Sie den Sitzungsstatus deaktivieren. Sie können die Sitzungsnutzung mit der folgenden Anweisung deaktivieren:
@EnableSessionState = False
Auf diese Weise prüft ASP keine Sitzungsinformationen mehr.
Wenn Sie sich auf den Sitzungsstatus verlassen müssen, sollten Sie vermeiden, große Datenmengen im Sitzungsobjekt zu speichern. Die Sitzung in IIS wird so lange aufrechterhalten, wie das HTTP-Cookie des Clients verfügbar ist, wodurch der von der Sitzung belegte Speicher belegt bleibt, bis die Sitzung beendet wird oder eine Zeitüberschreitung auftritt. Wenn also viele Benutzer Ihr Programm gleichzeitig verwenden, können Ihre Serverressourcen erschöpft sein.
Datenbankzugriff
Datenbankzugriff ist ein Muss? Der Zugriff auf eine Datenbank wird Ihre Anwendung drastisch verlangsamen, aber offensichtlich wären viele Websites ohne eine Datenbank wertlos. Wenn Sie jedoch über gespeicherte Prozeduren auf die Datenbank zugreifen, anstatt eingebettete SQL-Anweisungen zu verwenden, können Sie die potenzielle Leistung steigern. Sie verfügen außerdem über eine hohe Flexibilität* durch die Verwendung gespeicherter Prozeduren und ActiveX-Datenobjekte (ADO). Geben Sie nach Möglichkeit Daten aus gespeicherten Prozeduren aus.
Stellen Sie sicher, dass Ihre Datenbank über Indizes verfügt, da dies die Effizienz Ihres Programms direkt verbessert. Versuchen Sie außerdem, Update Statistics auf Ihrem Datenbankserver auszuführen, um Ihre Datenverteilung zu verfolgen, damit Ihre Datenbank die Abfrageausführung basierend auf diesen Informationen ändern kann. Beachten Sie, dass einige Datenbanken, wie z. B. MS Access, in Programmen auf Unternehmensebene wirklich akzeptabel sind? SQL Sever 7.0 oder Oracle ist die bessere Wahl.
Lassen Sie SQL so arbeiten, wie es entwickelt wurde, um Daten zu zählen, zu verbinden, zu sortieren und zu gruppieren. Wenn Sie eine Abfrageanweisung schreiben können, um diese Dinge zu tun, tun Sie es nicht selbst in anderen Sprachen.
Hier ist die einfachste Syntax zum Zählen aller Spalten:
SELECT count(*) FROM editors WHERE state='NY'
Wenn Sie eine bestimmte Spalte zählen, müssen Sie die Anweisung „group by“ verwenden, um diese Spalte zu gruppieren, sonst funktioniert es nicht:
SELECT count(city),city FROM editors GROUP BY town
Zurückgegebene kategorisierte Daten:
SELECT * FROM TableName WHERE FieldName>50 OR FieldName<100 ORDER BY FieldName2, Field Name3
Odbc oder Datei-DSN verwenden, um eine Verbindung zur Datenbank herzustellen? Verwenden Sie die schnelle OLEDB-Provider-Technologie, um eine Verbindung zu Ihrer Datenbank herzustellen, anstatt eine DSN-Verbindung zu verwenden. Sie müssen Ihren ISP (oder Datenbankadministrator/Netzwerkadministrator) nicht mehr bitten, einen System-DSN für Sie einzurichten, und es müssen keine Konfigurationsänderungen vorgenommen werden, wenn Sie Webdateien verschieben.
OLEDB sitzt zwischen der ODBC-Schicht und der Anwendung. ADO ist eine Anwendung auf ODEDB in Ihren ASP-Seiten. Ihre ADO-Aufrufe werden zuerst an OLEDB und dann an die ODBC-Schicht gesendet. Sie können jedoch eine direkte Verbindung zur OLEDB-Schicht herstellen und dann eine Verbesserung der serverseitigen Leistung feststellen. Wie stellt man jedoch eine direkte Verbindung zu OLEDB her?
Wenn Sie SQLServer 7 verwenden, verwenden Sie den folgenden Verbindungscode, um eine Verbindung zur Datenbank herzustellen:
strConnString = DSN='';DRIVER={SQL SERVER};
UID=myuid;PWD=mypwd;
DATABASE=MyDb;SERVER=MyServer;
Der wichtigste Parameter ist der DRIVER=-Teil. Wenn Sie ODBC umgehen und über OLEDB (eine schnellere Verbindung) eine Verbindung zu SQL Server herstellen möchten, verwenden Sie die folgende Syntax:
strConnString =Provider=SQLOLEDB.1;Password=mypassword & _
Persist Security Info=True;Benutzer-ID=myuid;
Ursprünglicher Katalog=mydbname & _
Datenquelle=meinserver;Verbindungszeitüberschreitung=15
Stimmt etwas nicht?
Jetzt fragen Sie sich vielleicht: Was ist der Sinn dieser neuen Verbindungsmethode? Warum nicht den Standard-DSN-losen/System-DSN-Ansatz verwenden? Nun, laut den Testergebnissen von Wrox in seinem Buch „ADO 2.0 Programmer's Reference“ werden Sie beim Vergleich der OLEDB-Verbindung mit DSN oder der DSN-losen Verbindungsmethode die folgenden Verbesserungen feststellen:
*Kann vergleichen:
SQL-Zugriff
OLEDBDSNOLEDBDSN
Verbindungszeit: 18?82?Verbindungszeit: 62?99
Zeit zum Abfragen von 1.000 Datensätzen: 29005400 Zeit zum Abfragen von 1.000 Datensätzen: 100950
Hinweis: Dieses Ergebnis finden Sie auf den Seiten 232 und 233 des Buches „ADO 2.0 Programmer's Reference“ von Wrox. Die Zeit wird in Millisekunden gemessen und die Abfragezeit für 1.000 Datensätze wird mithilfe eines serverseitigen Cursors berechnet (es gibt keinen großen Leistungsunterschied zwischen OLEDB- und DSN-Recordsets, wenn clientseitige Cursor verwendet werden).
ASP-Dekodierungsproblem:
Überprüfen Sie nach Möglichkeit Benutzereingaben auf der Clientseite, um die Anzahl der HTTP-Roundtrip-Anfragen zu reduzieren. Wenn Ihr Browser JavaScript oder andere Skripte unterstützt, nutzen Sie deren Leistungsfähigkeit, um mehr Serverressourcen freizugeben.
Das folgende VBScript wird im Client-Browser ausgeführt, um Benutzerinformationen zu validieren, bevor sie an Ihren Server übermittelt werden:
<SCRIPT LANGUAGE=VBScript>
<!--
Sub btnEnter_OnClick
DimTheForm
Setzen Sie TheForm = Document.MyForm
If IsNumeric(TheForm.Age.Value) Then
TheForm.submit
Anders
Msgbox Bitte geben Sie ein numerisches Alter ein.
Ende wenn
Sub beenden
//-->
</SCRIPT>
<FORMmethod=POST name=MyFormaction=myfile.asp>? Name: <INPUT typr=text name=Name>
Alter: <INPUT-Typ=Textname=Alter>
<INPUT type=button name=btnEntervalue=Enter>
</FORM>
Verwenden Sie lokale Variablen und vermeiden Sie globale Variablen. Auf lokale Variablen greift die Asp-Skript-Engine schneller zu als auf globale Variablen, da nicht die gesamte Namensdomäne durchsucht werden muss. Vermeiden Sie es, Array-Definitionen zu ändern. Es ist effizienter, einfach bei der ersten Initialisierung ausreichend Größe zuzuweisen. In diesem Fall verschwenden Sie möglicherweise etwas Speicher, profitieren aber von der Geschwindigkeit. Diese Technik ist offensichtlich effektiv, wenn der Server stark ausgelastet ist.
Wenn Sie auf ein Objekt verweisen müssen, das nicht unbedingt verwendet wird, ist es besser, das Tag <OBJECT> anstelle der Methode Server.CreateObject zu verwenden. Die Verwendung von Server.CreateObject führt dazu, dass das Objekt sofort erstellt wird. Wenn Sie das Objekt nicht sofort verwenden, nachdem Sie es mit <object> definiert haben, werden keine Ressourcen verschwendet.
Beispiel: Im folgenden Beispiel wird das <OBJECT>-Tag verwendet, um eine Werberad-Ad Rotator-Objektimplementierung für den Anwendungsbereich zu erstellen.
Beispiel:
<OBJECT runat=serverscope=Application id=MyAds progid=MSWC.AdRotator>
</OBJEKT>
Nachdem Sie das Ad Rotator-Objekt in der Anwendung gespeichert haben, können Sie mit der folgenden Syntax auf jeder Programmseite auf das Objekt zugreifen
<%=MyAds.GetAdvertisement(CustomerAds.txt) %>
Aktivieren Sie den Schalter „Option Explicit“. In VB und VBScript können Sie Variablen ohne explizite Deklaration verwenden. Durch Aktivieren dieser Option können jedoch Variablen identifiziert und definiert werden, wodurch Variablen gut geschrieben und die Leistung verbessert werden können. Undefinierte lokale Variablen sind langsamer, da der Namespace vor dem Erstellen durchsucht werden muss, um festzustellen, ob die Variable vorhanden ist. Beseitigen Sie es und definieren Sie jede Variable klar (zuerst definieren, später verwenden).
Das ist eine gute Angewohnheit, es kann zu Tippfehlern führen und es geht schneller.
Sofern Sie sie nicht wirklich benötigen, verwenden Sie nicht die Methode Server.MapPath. Verwenden Sie den tatsächlichen Pfad, wenn Sie ihn kennen. Die Verwendung von MapPath erfordert, dass IIS den aktuellen Serverpfad abruft. Dies bedeutet, dass eine spezielle Anfrage an den Server gesendet werden muss, was zu einer verringerten Leistung führt. Eine andere Methode besteht darin, den Pfad in einer lokalen Variablen zu speichern und bei Bedarf zu verwenden, sodass der Server nicht mehrmals nachschlagen muss.
Überprüfen Sie, wie es Ihnen geht
Sie können Ihre Systemleistung mit Tools wie System Performance Monitor, netMon und PerfMon messen. Um die Web*-Leistung zu testen, können Sie WCAT (Web Capacity Analysis Tool) verwenden. Mit WCAT können Sie die Fähigkeit Ihres IIS-Servers und Ihrer Netzwerkkonfiguration testen, auf eine Vielzahl von Clientanfragen, Daten oder HTML-Seiten zu reagieren. Diese Testergebnisse können als Leitfaden für die Optimierung Ihrer Server- und Netzwerkkonfigurationen verwendet werden. WCAT wurde speziell entwickelt, um den Umfang der Kundenarbeitslast abzuschätzen, auf den Internetdienste in Windows 2000 (oder Windows NT) und IIS reagieren können.
(Simulation). Weitere Informationen finden Sie im IIS Resource Kit. Auf der MSDN Online Web-Sorkshop-Website gibt es außerdem ein ausführliches WCAT-Benutzerhandbuch mit einem Download-Link. Wenn Sie Ihre Asp*-Fähigkeiten ernst nehmen, sollten Sie sich unbedingt dieses Tool besorgen.
Bemühen Sie sich um eine Optimierung der Anwendungsleistung, damit Ihre Webanwendung reibungsloser läuft. Beeinträchtigen Sie die Serverleistung nicht, wenn Sie sie nicht wirklich benötigen.
ASP verwendet gespeicherte Prozeduren, um Daten-Paging zu implementieren
1. Erstellen Sie die Tabelle tiku_koushi
falls vorhanden (wählen Sie * aus dbo.sysobjects aus, wobei die ID = ist
object_id(N'[dbo].[tiku_koushi]') und OBJECTPROPERTY
(id, N'IsUserTable') = 1)
Tabelle löschen [dbo].[tiku_koushi]
GEHEN
TABELLE ERSTELLEN [dbo].[tiku_koushi] (
[id] [int] IDENTITY (1, 1) NICHT NULL,
[Titel] [varchar] (250) SORTIEREN
Chinese_PRC_CI_AS NULL ,
[list2_id] [char] (10) SORTIEREN
Chinese_PRC_CI_AS NULL
) AUF [PRIMÄR]
GEHEN
2. Gespeicherte Prozedur sp_c
CREATE proc sp_c
@tablename varchar(50),
@title varchar(250),
@list2_id varchar(50)
als
if @tablename='tiku_koushi'
Wählen Sie count(*) aus tiku_koushi aus, wobei der Titel wie '%'+@title+'%' und list2_id=@list2_id lautet
GEHEN
3. Gespeicherte Prozedur sp_search_tiku
PROZEDUR ERSTELLEN sp_search_tiku
@tablename varchar(50),
@title varchar(250),
@list2_id varchar(10),
@pagesize int,
@page int
ALS
if @tablename='tiku_koushi'
beginnen
deklariere @ks int
deklariere @str varchar(200)
set @ks=@pagesize*(@page-1)
falls nicht vorhanden (wählen Sie * aus dbo.sysobjects aus, wobei id = object_id(N'[dbo].[temp_table91]') und OBJECTPROPERTY(id, N'IsUserTable') = 1)
beginnen
Wählen Sie * in temp_table91 von tiku_koushi aus, wo
Titel wie '%'+@title+'%' und list2_id=@list2_id Reihenfolge
von id desc
set rowcount @pagesize
set @str='select * from temp_table91 where id not in
(Wählen Sie die obere ID „+str(@ks)+“ aus temp_table91 aus.)
ausführen(@str)
Löschen Sie die Tabelle temp_table91
Ende
Ende
GEHEN
4. search_koushi.asp
<!-- #include file=conn.asp -->
<%
Zeile=6
if request(page)= then
Seite=1
anders
page=Anfrage(Seite)
Ende wenn
Wenn Seite <1, dann
Seite=1
Ende wenn
title=trim(request(title))
list2_id=trim(request(list2_id))
set rs2=conn.execute(sp_c 'tiku_koushi','&title&','&list2_id&')
pagecount=CInt(rs2(0)/line)
if(CInt(rs2(0)) mod line)=0 then
Seitenanzahl=Seitenanzahl
anders
Seitenanzahl=Seitenanzahl+1
Ende wenn
if CInt(page)>=pagecount dann
page=CInt(pagecount)
Ende wenn
str=
str=str&page=&page&&title=&title&&list2_id=&list2_id
setze rs=conn.execute
(sp_search_tiku 'tiku_koushi','&title&','&list2_id&','&line&','&CInt(page)&')
wenn rs.eof dann
Antwort.Schreibe keinen Datensatz
anders
%>
<html>
<Kopf>
<style type=text/css>
td{font-size:12px;}
a{text-decoration:none;}
</style>
<Skriptsprache=Javascript>
</script>
</head>
<Körper>
<table width=518 border=1 bordercolorlight=000000
bordercolordark=#ffffff
align=center cellpadding=0 Cellspacing=0>
<!--DWLayoutTable-->
<tr bgcolor=#dfdfdf>
<td width=454 align=center height=24 valign=middle>Mündliche Prüfungsfragen</td>
<td width=63 align=center valign=middle>Löschen</td>
</tr>
<% do bis rs.eof %>
<tr height=22>
<td valign=middle>·<a href=void(0)
onclick=window.open('editkoushi.asp?id=<%=rs(id)%>&page=<%=page%>&title=<%=title%>&list2_id=<%=list2_id%>','' ,'width=518
Höhe=160 links=100')>
<%=rs(title)%></a></td>
<td align=center valign=middle>Löschen</td>
</tr>
<%
rs.movenext
Schleife
%>
<tr align=left valign=middle bgcolor=efeff6
Höhe=22>
<td colspan=2 style=padding-left:6px;>
<a href=search_koushi.asp?page=<%=1%>&title=<%=title%>&list2_id=<%=list2_id%>>Startseite</a> <a
href=search_koushi.asp?page=<%=page-1%>&title=<%=title%>&list2_id=<%=list2_id%>>Vorherige Seite</a> <a
href=search_koushi.asp?page=<%=page+1%>&title=<%=title%>&list2_id=<%=list2_id%>>Nächste Seite</a> <a
href=search_koushi.asp?page=<%=pagecount%>&title=<%=title%>&list2_id=<%=list2_id%>>Letzte Seite</a>
Insgesamt <%=pagecount%> Seiten. Die aktuelle Seite ist: <%=page%>/<%=pagecount%> Seiten
Es gibt insgesamt <%=rs2(0)%> Datensätze</td>
</tr>
</table>
</body>
</html>
<%
rs2.close
setze rs2=nichts
rs.close
setze rs=nichts
Ende wenn
%>