Källkoden för /anders.enges/asp/db2opti.asp

<!--#include file="../inc/navstuff.asp" -->
Normalt skall vi inte loopa genom fälten som i föregående exempel. Loopar tar tid
och oftast så vet vi ju vilka fält från databasen vi vill visa. Men även när vi använder
konstruktionen <span class=asp><i>RS</i>("<i>FÄLTNMAMN</i>")</span> eller <span class=asp><i>RS</i>(<i>indexsiffra</i>)</span>
så krävs en "sökning" då rätt fält skall hittas i fältkollektionen.<p>
Genom att använda nedanstående metod så görs denna "fältsökning" bara en gång<p>
Använder vi SELECT * FROM... kan det ju även hända att vi inte behöver alla fält som kommer
i resultattabellen.<p>

En prestanda optimerad kod blir då:<br>
(Eftersom IIS kompilerar ASP koden först gången den körs så kan
koden vara lite trög första gången sidan laddas.
Nästa gång har den fått upp farten)<p>
<div class=code>
<span class=asp><% <br>
' för att kunna mäta snabbheten så lagrar jag först nuvarande tid<br>
startTime = now <br>
%></span><br>
<FONT COLOR=#006400><!-- #include file="connection.asp" --></font><br>
<span class=asp><%<BR>
' Deklarerar variablerna som skall användas<br>
Dim Conn<BR>
Dim RS<BR>
' Nedanstående kall användas för objekt av type Field<BR>
Dim byteField, textField, memoField<br>
<BR>
Set Conn = Server.CreateObject("ADODB.Connection")<BR>
Conn.Open strConn<BR>
<BR>
' Första optimeringen - tag bara de fält vi vill ha<br>
Set RS = Conn.Execute("SELECT aBYTE, aTEXT, aMEMO FROM EXEMPELDATA ORDER BY aTEXT")<BR>
<BR>
' Andra och viktigaste optimeringen<br>
' Säger nedan vilket fältobjekt som är vilket fält<br>
' Observera att om det är objekt så måste Set användas<br>
' Det blir oftast STOR skillnad i fart om man använder fältobjekt<br>
Set byteField = RS("aBYTE")<BR>
Set textField = RS("aTEXT")<BR>
Set memoField = RS("aMEMO")<BR>
%>
</span><BR>
<TABLE BORDER=1><br>
<TR><br>
<td>aBYTE</td><td>aTEXT</td><td>aMEMO</td><br>
</TR><br>
<span class=asp><% Do While Not RS.EOF %></span><br>
   <TR><br>
      <td valign="top"><br>
         <span class=asp><%= byteField %></span><br>
      </td><br>
      <td valign="top"><br>
         <span class=asp><%= textField %></span><br>
      </td><br>
      <td valign="top"><br>
         <span class=asp><%= memoField %></span><br>
      </td><br>
   </TR><br>
   <span class=asp><%<br>
   RS.MoveNext<br>
Loop<br>
RS.Close<br>
Conn.Close<br>
Set RS = Nothing<br>
Set Conn = Nothing<br>
%></span><br>
<span class=asp><%<br>
' räknar ut skillnaden mellan nu (now) och den tid vi sparade innan <br>
' vi startade programkoden<br>
="Tid i sekunder: " & DateDiff("s", startTime, now) <br>
%></span><br>
</div>
<p>
Förklaring till ovanstående program:<hr>
<dl>
<dt><Span class=asp>Set RS = Conn.Execute("SELECT aBYTE, aTEXT, aMEMO FROM EXEMPELDATA ORDER BY aTEXT")</span>
<dd>Vi säger vilken tabell vi vill ha med hjälp av en vanlig SQL SELECT sats. Dessutom preciserar vi exakt vilka fält vi är intresserade av.
ORDER BY aTEXT gör att det sorteras enligt fältet aTEXT<p>
<dt><Span class=asp>Set byteField = RS("aBYTE")<BR>
Set textField = RS("aTEXT")<BR>
Set memoField = RS("aMEMO")<BR>
</span>
<dd>Genom att skapa fältvariabler så söker vi fram rätt fält en
gång för alla. Om vi i en loop använder <Span class=asp>RS("aBYTE")</span> så måste ADO för varje var söka fram det fält ti tabellen som heter <b>aBYTE</b><br>
Nu vet den exekt vilket fält som avses och vikan då använda <span class=asp><%= byteField %></span> istället<p>
</dl>
<p>
Resultatet av ovanstående program blir:<br>
<div class=res>
<%  startTime = now %> 
<!--  #include file="../inc/connection.asp" -->
<%
' Deklarerar objekten
Dim Conn
Dim RS
Dim byteField, textField, memoField
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConn
Set RS = Conn.Execute("SELECT aBYTE, aTEXT, aMEMO FROM EXEMPELDATA ORDER BY aTEXT")
Set byteField = RS("aBYTE")
Set textField = RS("aTEXT")
Set memoField = RS("aMEMO")
%>

<TABLE BORDER=1>
<TR>
<td>aBYTE</td><td>aTEXT</td><td>aMEMO</td>
</TR>
<%  Do While Not RS.EOF %>
    <TR>
           <td valign="top">
                <%= byteField %>
           </td>
           <td valign="top">
                <%= textField %>
           </td>
           <td valign="top">
                <%= memoField %>
           </td>
      </TR>
    <%
    RS.MoveNext
Loop
RS.Close
Conn.Close
Set RS = Nothing
Set Conn = Nothing
%>
 
</table>
<%  ="Tid i sekunder att utföra programmet: " & DateDiff("s", startTime, now) %> 
</div>
<!--#include file="../inc/footer.asp" -->