Notes
Slide Show
Outline
1
ASP.NET
  • LA C#, SIG of LAFox.org
  • September 3, 2002
2
Overview
  • The talk will present
    • Setup of Visual Studio .NET web development
    • Resolving setup problems
    • ASP.NET web page development with Visual Studio .NET
    • Some simple apps coded directly with a text editor
    • Benchmarks comparing performance of ASP with VBScript, and ASP.NET with VB and C#

  • Code examples and this presentation are on the web at http://www.vi-i.com/talks and a downloadable zip file is at http://www.lacsharp.org.


3
Setup of Visual Studio .NET web development
  • Install IIS
  • Install Visual Studio .NET
  • If web apps do not work (happens especially on XP), run these commands to install web server support for ASP.NET:
    • %windir%\Microsoft.NET\Framework\v1.0.3705\aspnet_regiis.exe –I
    • regsvr32 %windir%\Microsoft.NET\Framework\v1.0.3705\aspnet_isapi.dll
  • (courtesy of research by Kenneth Leland)


4
Debugging failure of ASP.NET to enter debug mode
  • ACTION:  Trying to locally automatic debug.
  • RESULT:  Error popup:
  • “Error while trying to run project:
  • Unable to start Debugging on the web server.   Could not start ASP.NET or ATL server debugging.
  • Verify that ASP.NET or ATL Server is correctly installed on the server. Would you like to disable
  • future attempts to debug ASP.NET pages for this project?”
  • STEPS TAKEN TO RESOLVE (from call to Microsoft):


  • In the Internet Services Manager, create the application for the project being debugged (right
  • click on the c:\inetpub\wwwroot\pcswebapp3 directory in the IIS manager, and click the “Create”
  • button to create that virtual directory as an application.  For more information on this, please see:
  • http://support.microsoft.com/?scid=kb;en-us;Q308164
  • Add the Interactive user to the launch and access permissions in dcomcnfg for “Machine Debug
  • Manager” and Just-In-Time Debugger Handler and CLR Remote Host
  •  1. From the Start menu, click Run, type dcomcnfg.exe, and then click OK.
  •  2. On the Applications tab, scroll down to the Machine Debug Manager, and double-click it to view
  •      Properties.
  •  3. On the Security tab, click "Use custom access permissions", and then click Edit.
5
Debugging failure of ASP.NET to enter debug mode, con’t
  • 4. Click Add to add the users who will be debugging to this list including Debugger Users, SYSTEM,
  •     and Interactive, and grant them Allow Access rights, or simply add the Administrators group to
  •     this list.
  • 5. In the Properties dialog box, click "Use custom launch permissions", and then click Edit.
  • 6. Click Add to add the users who will be debugging to this list, and grant them Allow Launch
  •     rights, or simply add the Administrators group to this list.
  • 7. Click Apply and then click OK.
  • 8. Double-click "Just-In-Time Debugger Handler and CLR Remote Host" on the Application tab to
  •    display the Properties, and repeat steps 3 through 7 for the "Just-In-Time Debugger Handler and
  •    CLR Remote Host".
  • 9. Close the Distributed COM Configuration Properties dialog box, and restart your computer.
  • We also, enabled ASP.NET debugging:
  • 1.       Right-click the project and select properties
  • 2.       Select the Configuration Properties/Debugging window
  • 3.       Select the entry for “Enable ASP.NET debugging”
  • Finally, we added the word “DEBUG” to the [AllowVerbs] section in the urlscan.ini file.  (Present
  • only if you have run IISLOCKD.exe to secure your server.)


6
How ASP.NET works
  • Web page activates back end processing, which generates HTML sent to the browser
  • Two organizations for ASP.NET applications
    • Single web page of file type aspx containing HTML and embedded code is run at the server to augment the HTML
    • A web page of file type .aspx which contains HTML and HTML-like objects with names connects with code in a separate “code behind” file, this code being activated to replace these objects with actual HTML before the page is sent to the browser
  • Two approaches
    • Back-end code creates and send entire page:
      • Code accesses data and builds the entire HTML page according to the code’s own internal algorithms
      • The page is sent as successive (or a single) string to the browser by calling System.Web.HttpResponse
7
How ASP.NET works, continued

    • Code uses Microsoft visual objects on the web page
      • Microsoft provides a collection of visual objects (or controls) that can be used on the page (edit boxes, grids, buttons, calendar)
      • These objects are placed on the page in the .aspx file with HTML-like code that specifies properties and an ID used to identify the object
      • Back-end (server) code tracks properties and methods for these objects
      • When the page is turned into HTML, these properties are applied and data is “bound” to these objects
      • When the user clicks a control on the web page, hidden submit variables send long binary strings to the server to specify the user’s action and what object was acted upon
      • The server then executes methods associated with these user actions before sending the next page
8
Professional C# PCSWebApp3 Application
  • Debugging Access to the Access Database when setting up the application


  • The web app to be described next, from the WROX Professional C# book, may give the error message
  • “Operation must use an updateable query”
  • when
  • int queryResult = insertCommand.ExecuteNonQuery();
  • Is executed.  This is because the web app does not have write access to the Access database, pcswebapp3.mdb, in the web directory.
  • Bring up Explorer on that directory, right click on this .mdb file in Explorer, pick properties, security tab, and for each of the accounts in the list
  • Web anonymous users
  • Web applications
  • ), click the Read and Write access permissions boxes.  (This is for Windows 2000 Server; for XP, give Everyone write access.)  Click OK.  Then the app will work.
9
Visual Studio Project
  • Professional CSharp PCSWebApp3 (with some additions): Visual Studio .NET view of application


10
PCSWebApp3 HTML code with embedded objects, page 1
  • <%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
  •  AutoEventWireup="false" Inherits="PCSWebApp3.WebForm1" %>
  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
  • <HTML>
  •   <HEAD>
  •     <title>WebForm1</title>
  •     <meta content="Microsoft Visual Studio 7.0" name="GENERATOR">
  •     <meta content="C#" name="CODE_LANGUAGE">
  •     <meta content="JavaScript" name="vs_defaultClientScript">
  •     <meta content="http://schemas.microsoft.com/intellisense/ie5"
  •      name="vs_targetSchema">
  •   </HEAD>
  •   <body MS_POSITIONING="GridLayout">
  •     <form id="Form1" method="post" runat="server">
  •       <h2 style="FONT-FAMILY: Arial" align="center">Enter details
  •        and set a day to initiate an event.
  •       </h2>
  •       <br>
11
PCSWebApp3 HTML, page 2
  •  <table borderColor="#000000" cellSpacing="0" cellPadding="8"
  •        rules="none" width="540" align="center" bgColor="#fff99e"
  •        border="2">
  •         <tr>
  •           <td style="FONT-FAMILY: Arial" vAlign="top" bgColor="#99ff00">
  •            Your Name:</td>
  •           <td vAlign="top" bgColor="#66ffcc"><asp:textbox id="nameBox"
  •            Runat="server" Width="160px"></asp:textbox><asp:requiredfieldvalidator
  •            id="validateName" Runat="server" ErrorMessage="You must enter a name."
  •            ControlToValidate="nameBox" Display="None">
  •            </asp:requiredfieldvalidator></td>
  •           <td vAlign="center" bgColor="#ff9900" rowSpan="4">
  •           <asp:calendar
  •            id="calendar" Runat="server" ShowGridLines="True" BorderStyle="Double"
  •            Font-Names="Arial" Font-Size="Smaller" BackColor="White"></asp:calendar></td>
  •         </tr>
  •         <tr>
  •           <td style="FONT-FAMILY: Arial" vAlign="top" bgColor="#99ff00">
  •            Event Name:</td>
  •           <td vAlign="top" bgColor="#99ff99"><asp:textbox id="eventBox"
  •            Runat="server" Width="160px"></asp:textbox><asp:requiredfieldvalidator
  •            id="validateEvent" Runat="server" ErrorMessage="You must enter an event name."
  •            ControlToValidate="eventBox" Display="None">
  •            </asp:requiredfieldvalidator></td>
  •         </tr>
12
PCSWebApp3 HTML, page 3
  •  <tr>
  •           <td style="FONT-FAMILY: Arial" vAlign="top" bgColor="#99ff00">Meeting Room:</td>
  •           <td vAlign="top" bgColor="#00ff99"><asp:dropdownlist id="roomList"
  •            Runat="server" Width="160px" DataTextField="Room" DataValueField="ID">
  •            </asp:dropdownlist><asp:requiredfieldvalidator id="validateRoom" Runat=
  •            "server" ErrorMessage="You must select a room." ControlToValidate="roomList"
  •             Display="None"></asp:requiredfieldvalidator></td>
  •         </tr>
  •         <tr>
  •           <td style="FONT-FAMILY: Arial" vAlign="top" bgColor="#99ff00">Attendees:</td>
  •           <td vAlign="top" bgColor="#66ff99"><asp:listbox id="attendeeList"
  •            Runat="server" Width="160px" DataTextField="Name" DataValueField="ID"
  •            SelectionMode="Multiple" Rows="6"></asp:listbox><asp:requiredfieldvalidator
  •            id="validateAttendees" Runat="server"
  •            ErrorMessage="You must have at least one attendee."
  •            ControlToValidate="attendeeList" Display="None">
  •            </asp:requiredfieldvalidator></td>
  •         </tr>
  •         <tr>
  •           <td align="middle" bgColor="#99ff00" colSpan="3">
  •           <asp:button id="submitButton" Runat="server" Width="197px"
  •            Text="Submit meeting room request"></asp:button>
  •           </td>
  •         </tr>
13
PCSWebApp3 HTML, page 4
  •  <tr>
  •           <td align="middle" bgColor="#99ff00" colSpan="3">
  •           <asp:validationsummary id="validationSummary" Runat="server"
  •            Font-Names="Arial" HeaderText="Before submitting your request:">
  •            </asp:validationsummary></td>
  •         </tr>
  •         <tr>
  •           <td align="left" width="100%" bgColor="#99ff00" colSpan="3">
  •             <table style="WIDTH: 485px; HEIGHT: 136px" cellSpacing="4" cols="4">
  •               <tr>
  •                 <td width="40%" bgColor="#ccffcc">
  •                   <asp:datalist id="eventDetails2" Runat="server" Font-Names="Arial"
  •                    Font-Size="Smaller" OnSelectedIndexChanged="eventDetails2_SelectedIndexChanged"
  •                     Height="69px">
  •                     <SelectedItemTemplate>
  •                       <b>
  •                         <%# DataBinder.Eval(Container.DataItem, "Name") %>
  •                       </b>
  •                       <br>
  •                     </SelectedItemTemplate>
  •                     <ItemTemplate>
  •                       <asp:LinkButton Runat="server" CommandName="Select"
  •                        ForeColor="#0000ff" ID="Linkbutton1" CausesValidation="False">
  •                         <%# DataBinder.Eval(Container.DataItem, "Name") %>
  •                       </asp:LinkButton>
14
PCSWebApp3 HTML, page 5
  •      <br>
  •                     </ItemTemplate>
  •                   </asp:datalist></td>
  •                 <td vAlign="top">
  •                   <P><asp:label id="edName" Runat="server" Font-Names="Arial"
  •                    Font-Size="Medium" Font-Italic="True" Font-Bold="True"
  •                     Font-Name="Arial">
  •                     Select an event to view details.
  •                     </asp:label><BR>
  •                     <asp:label id="edDate" Runat="server" Font-Names="Arial"
  •                      Font-Size="Smaller"></asp:label><br>
  •                     <asp:label id="edRoom" Runat="server" Font-Names="Arial"
  •                      Font-Size="Smaller"></asp:label><br>
  •                     <asp:label id="edAttendees" Runat="server" Font-Names="Arial"
  •                      Font-Size="Smaller"></asp:label></P>
  •                   <P>
  •                     <asp:Button id="Button1" runat="server" Text="Delete Event">
  •                     </asp:Button></P>
  •                 </td>
  •               </tr>
  •             </table>
  •           </td>
  •         </tr>
  •       </table>
  •       <br>
  •       <center><font style="FONT-FAMILY: Arial">Results:</font>
  •         <asp:label id="resultLabel" Runat="server" Font-Names="Arial" Text="None.">
  •         None.</asp:label></center>
15
PCSWebApp3 HTML, page 6
  • <br>
  •       <br>
  •       <asp:DataGrid Runat="server" ID="eventDetails1" BackColor="#FFFFC0"
  •        Font-Size="Smaller" Font-Names="Arial" BorderStyle="Solid" BorderWidth="2px"
  •         BorderColor="Gray" CellPadding="2" HorizontalAlign="Center" AutoGenerateColumns="False">
  •         <HeaderStyle Font-Size="Small" Font-Names="Arial" Font-Bold="True"
  •          HorizontalAlign="Center" VerticalAlign="Middle"></HeaderStyle>
  •         <Columns>
  •           <asp:BoundColumn DataField="ID" HeaderText="Event ID">
  •             <ItemStyle HorizontalAlign="Right"></ItemStyle>
  •           </asp:BoundColumn>
  •           <asp:BoundColumn DataField="Room" HeaderText="Room">
  •             <ItemStyle HorizontalAlign="Right"></ItemStyle>
  •           </asp:BoundColumn>
  •           <asp:BoundColumn DataField="AttendeeList" HeaderText="Attendee List">
  •             <ItemStyle HorizontalAlign="Left"></ItemStyle>
  •           </asp:BoundColumn>
  •           <asp:BoundColumn DataField="EventDate" HeaderText="Event Date">
  •             <ItemStyle Wrap="False" HorizontalAlign="Left"></ItemStyle>
  •           </asp:BoundColumn>
  •         </Columns>
  •       </asp:DataGrid></form>
  •   </body>
  • </HTML>


16
Displayed page
17
HTML, Page 1 (clicking button sends state)

  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
  • <HTML>
  • <HEAD>
  • <title>WebForm1</title>
  • <meta content="Microsoft Visual Studio 7.0" name="GENERATOR">
  • <meta content="C#" name="CODE_LANGUAGE">
  • <meta content="JavaScript" name="vs_defaultClientScript">
  • <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
  • </HEAD>
  • <body MS_POSITIONING="GridLayout">
  • <form name="Form1" method="post" action="webform1.aspx" language="javascript" onsubmit="ValidatorOnSubmit();" id="Form1">
  • <input type="hidden" name="__EVENTTARGET" value="" />
  • <input type="hidden" name="__EVENTARGUMENT" value="" />
  • <input type="hidden" name="__VIEWSTATE" value="dDwtNDA0MDkxMzA2O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDQ+O2k8OT47aTwxMj47aTwxOT47aTwzMz47PjtsPHQ8QDA8cDxwPGw8U0Q7PjtsPGw8U3lzdGVtLkRhdGVUaW1lLCBtc2NvcmxpYiwgVmVyc2lvbj0xLjAuMzMwMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8MjAwMi0wOC0zMT47Pjs+Pjs+Ozs7Ozs7Ozs7Oz47Oz47dDx0PDt0PGk8MjA+O0A8VGhlIEhhcHB5IFJvb207VGhlIEFuZ3J5IFJvb207VGhlIERlcHJlc3NpbmcgUm9vbTtUaGUgRnVua2VkIE91dCBSb29tO1RoZSBPdmVyYWN0aW5nIFJvb207VGhlIFRvcnR1cmUgQ2hhbWJlcjtUaGUgQmFucXVldGluZyBIYWxsO1RoZSBTdHVkeTtUaGUgU2VjcmV0IFBhc3NhZ2U7VGhlIEN1cGJvYXJkIFVuZGVyIFRoZSBTdGFpcnM7VGhlIEJlZHJvb207VGhlIFB1YjtUaGUgQnVja2V0IE9mIExhcmQ7VGhlIENoZWVreSBSb29tO1RoZSBBYXJkdmFyayBTYW5jdHVhcnk7VGhlIFRpbnkgUm9vbTtUaGUgVG9pbGV0O1RoZSBBbnRlY2hhbWJlcjtUaGUgQ2hhbWJlciBvZiBBdW50aWVzO1RoZSBTb2ZhIFJvb207PjtAPDE7MjszOzQ7NTs2Ozc7ODs5OzEw
18
HTML, Page 2 (more hidden state info)
  •  OzExOzEyOzEzOzE0OzE1OzE2OzE3OzE4OzE5OzIwOz4+Oz47Oz47dDx0PDt0PGk8MjA+O0A8QmlsbCBHYXRlcztNb25pY2EgTGV3aW5za3k7VmluY2VudCBQcmljZTtWbGFkIHRoZSBJbXBhbGVyO0lnZ3kgUG9wO1dpbGxpYW0gU2hha2VzcGVhcmU7U2VhbiBDb25uZXJ5O1JvZ2VyIE1vb3JlO0RhbGV5IFRob21wc29uO0FsYmVydCBFaW5zdGVpbjtEciBGcmFuayBOIEZ1cnRlcjtDaHJpc3RvcGhlciBDb2x1bWJ1cztNeXJhIEhpbmRsZXk7R2VvcmdlIENsb29uZXk7Qm9iYnkgRGF2cm87Sm9obiBGIEtlbm5lZHk7TWFvIFRzZSBUdW5nO0p1bGVzIFZlcm5lO1N0ZXBoZW4gS2luZztSb2JpbiBIb29kOz47QDwxOzI7Mzs0OzU7Njs3Ozg7OTsxMDsxMTsxMjsxMzsxNDsxNTsxNjsxNzsxODsxOTsyMDs+Pjs+Ozs+O3Q8QDA8cDxwPGw8RGF0YUtleXM7XyFJdGVtQ291bnQ7PjtsPGw8PjtpPDEzPjs+Pjs+Ozs7Ozs7Ozs+O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjtpPDQ+O2k8NT47aTw2PjtpPDc+O2k8OD47aTw5PjtpPDEwPjtpPDExPjtpPDEyPjs+O2w8dDw7bDxpPDE+Oz47bDx0PDtsPGk8MD47PjtsPHQ8QDxNeSBCaXJ0aGRheTs+Ozs+Oz4+Oz4+O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDA+Oz47bDx0PEA8RGlubmVyOz47Oz47Pj47Pj47dDw7bDxpPDE+Oz47bDx0PDtsPGk8MD47PjtsPHQ8QDxEaXNjdXNzaW9uIG9mIGRhcmtuZXNzOz47Oz47Pj47Pj47dDw7bDxpPDE+Oz47bDx0PDtsPGk8MD47PjtsPHQ8QDxDaHJpc3RtYXMgd2l0aCBQYWxzOz47Oz47Pj47Pj47dDw7bDxpPDE+Oz47bDx0PDtsPGk8MD47PjtsPHQ8QDxFc2NhcGU7Pjs7Pjs+Pjs+Pjt0PDtsPGk8MT47PjtsPHQ8O2w8aTwwPjs+O2w8dDxAPFBsYW5ldGFyeSBDb25xdWVzdDs+Ozs+Oz4+Oz4+O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDA+Oz47bDx0PEA8SG9tZWNvbWluZyBDZWxlYnJhdGlvbjs+Ozs+Oz4+Oz4+O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDA+Oz47bDx0PEA8RGFsZWsgUmV1bmlvbiBCYWxsOz47Oz47Pj47Pj47dDw7bDxpPDE+Oz47bDx0PDtsPGk8MD47PjtsPHQ8QDxSb21hbnRpYyBtZWFsIGZvciB0d287Pjs7Pjs+Pjs+Pjt0PDtsPGk8MT47PjtsPHQ8O2w8aTwwPjs+O2w8dDxAPEJvb2sgTGF1bmNoOz47Oz47Pj47Pj47dDw7bDxpPDE+Oz47bDx0PDtsPGk8MD47PjtsPHQ8QDxUcmVlIEh1Z2dpbmc7Pjs7Pjs+Pjs+Pjt0PDtsPGk8MT47PjtsPHQ8O2w8aTwwPjs+O2w8dDxAPEFyc2Vtb25nZXJpbmc7Pjs7Pjs+Pjs+Pjt0PDtsPGk8MT47PjtsPHQ8O2w8aTwwPjs+O2w8dDxAPE5lYXJseSB0aGUgZW5kIG9mIE1hcmNoOz47Oz47Pj47Pj47Pj47dDxAMDxwPHA8bDxQYWdlQ291bnQ7XyFJdGVtQ291bnQ7XyFEYXRhU291cmNlSXRlbUNvdW50O0RhdGFLZXlzOz47bDxpPDE+O2k8MTM+O2k8MTM+O2w8Pjs+Pjs+Ozs7Ozs7Ozs7Oz47bDxpPDA+Oz47bDx0PDtsPGk8MT47aTwyPjtpPDM+O2k8ND47aTw1PjtpPDY+O2k8Nz47aTw4PjtpPDk+O2k8MTA+O2k8MTE+O2k8MTI+O2k8MTM+Oz47bDx0PDtsPGk8MD47aTwxPjtpPDI+O2k8Mz47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8NDs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8SWdneSBQb3AgKDUpLCBTZWFuIENvbm5lcnkgKDcpLCBBbGJlcnQgRWluc3RlaW4gKDEwKSwgR2VvcmdlIENsb29uZXkgKDE0KSwgSnVsZXMgVmVybmUgKDE4KSwgUm9iaW4gSG9vZCAoMjApLCAgYW5kIEthcmxpIFdhdHNvbjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8OS8xNy8yMDAyIDEyOjAwOjAwIEFNOz4+Oz47Oz47Pj47dDw7bD
19
HTML, Page 3 (more hidden state info)
  • xpPDA+O2k8MT47aTwyPjtpPDM+Oz47bDx0PHA8cDxsPFRleHQ7PjtsPDI7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDE7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEJpbGwgR2F0ZXMgKDEpLCBNb25pa2EgTGV3aW5za3kgKDIpLCAgYW5kIEJydWNlIExlZTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8OC81LzIwMDIgMTI6MDA6MDAgQU07Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47aTwxPjtpPDI+O2k8Mz47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8NTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Njs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8VmxhZCB0aGUgSW1wYWxlciAoNCksIE15cmEgSGluZGxleSAoMTMpLCAgYW5kIEJlZWx6ZWJ1Yjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8MTAvMjkvMjAwMiAxMjowMDowMCBBTTs+Pjs+Ozs+Oz4+O3Q8O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjs+O2w8dDxwPHA8bDxUZXh0Oz47bDw2Oz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDw5Oz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxEciBGcmFuayBOIEZ1cnRlciAoMTEpLCBCb2JieSBEYXZybyAoMTUpLCBKb2huIEYgS2VubmVkeSAoMTYpLCBTdGVwaGVuIEtpbmcgKDE5KSwgIGFuZCBLYXJsaSBXYXRzb247Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDEyLzI1LzIwMDIgMTI6MDA6MDAgQU07Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47aTwxPjtpPDI+O2k8Mz47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8Nzs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8MTc7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPE1vbmlrYSBMZXdpbnNreSAoMiksIFN0ZXBoZW4gS2luZyAoMTkpLCAgYW5kIFNwYXJ0YWN1czs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8NS8xMC8yMDAyIDEyOjAwOjAwIEFNOz4+Oz47Oz47Pj47dDw7bDxpPDA+O2k8MT47aTwyPjtpPDM+Oz47bDx0PHA8cDxsPFRleHQ7PjtsPDg7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDE0Oz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxCaWxsIEdhdGVzICgxKSwgQWxiZXJ0IEVpbnN0ZWluICgxMCksIERyIEZyYW5rIE4gRnVydGVyICgxMSksIEJvYmJ5IERhdnJvICgxNSksICBhbmQgRGFydGggVmFkZXI7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDYvMTUvMjAwMiAxMjowMDowMCBBTTs+Pjs+Ozs+Oz4+O3Q8O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjs+O2w8dDxwPHA8bDxUZXh0Oz47bDw5Oz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDw3Oz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxXaWxsaWFtIFNoYWtlc3BlYXJlICg2KSwgQ2hyaXN0b3BoZXIgQ29sdW1idXMgKDEyKSwgUm9iaW4gSG9vZCAoMjApLCAgYW5kIFVseXNzZXM7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDYvMjIvMjAwMiAxMjowMDowMCBBTTs+Pjs+Ozs+Oz4+O3Q8O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjs+O2w8dDxwPHA8bDxUZXh0Oz47bDwxMDs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8MTI7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPFJvZ2VyIE1vb3JlICg4KSwgR2VvcmdlIENsb29uZXkgKDE0KSwgQm9iYnkgRGF2cm8gKDE1KSwgIGFuZCBEYXZyb3M7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDYvMTIvMjAwMiAxMjowMDowMCBBTTs+Pjs+Ozs+Oz4+O3Q8O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjs+O2w8dDxwPHA8bDxUZXh0Oz47bDwxMTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8MTM7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEdlb3JnZSBDbG9vbmV5ICgxNCksICBhbmQgRG9ubmEgV2F0c29uOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDwzLzI5LzIwMDIgMTI6MDA6MDAgQU07Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47aTwxPjtpPDI+O2k8Mz47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8NTA7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDM7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEJpbGwgR2F0ZXMgKDEpLCBXaWxsaWFtIFNoYWtlc3BlYXJlICg2KSwgSnVsZXMg
20
HTML, Page 4 (more; java submit function)
  • VmVybmUgKDE4KSwgIGFuZCBKdWxpYW4gU2tpbm5lcjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8NC82LzIwMDIgMTI6MDA6MDAgQU07Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47aTwxPjtpPDI+O2k8Mz47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8NTM7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDE7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPFZsYWQgdGhlIEltcGFsZXIgKDQpLCAgYW5kIEdhcnk7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDUvMTYvMjAwMiAxMjowMDowMCBBTTs+Pjs+Ozs+Oz4+O3Q8O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjs+O2w8dDxwPHA8bDxUZXh0Oz47bDw1NTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Nzs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8VmluY2VudCBQcmljZSAoMyksIElnZ3kgUG9wICg1KSwgU3RlcGhlbiBLaW5nICgxOSksICBhbmQgRmluaXNoZWQ7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDEvMjIvMjAwMiAxMjowMDowMCBBTTs+Pjs+Ozs+Oz4+O3Q8O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjs+O2w8dDxwPHA8bDxUZXh0Oz47bDw1Njs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Njs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8U2VhbiBDb25uZXJ5ICg3KSwgUm9nZXIgTW9vcmUgKDgpLCBEYWxleSBUaG9tcHNvbiAoOSksICBhbmQgS2FybGkgV2F0c29uOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDwyLzI4LzIwMDIgMTI6MDA6MDAgQU07Pj47Pjs7Pjs+Pjs+Pjs+Pjs+Pjs+PjtsPGF0dGVuZGVlTGlzdDs+PmMM/BaWhI6WX8nQN894ypg28RGy" />


  • <script language="javascript">
  • <!--
  • function __doPostBack(eventTarget, eventArgument) {
  • var theform = document.Form1;
  • theform.__EVENTTARGET.value = eventTarget;
  • theform.__EVENTARGUMENT.value = eventArgument;
  • theform.submit();
  • }
  • // -->
  • </script>
21
HTML, Page 5 (required entry validation)

  •         <script language="javascript" src="/aspnet_client/system_web/1_0_3705_288/WebUIValidation.js"></script>



  • <h2 style="FONT-FAMILY: Arial" align="center">Enter details and set a day to
  • initiate an event.
  • </h2>
  • <br>
  • <table borderColor="#000000" cellSpacing="0" cellPadding="8" rules="none" width="540“ align="center" bgColor="#fff99e" border="2">
  •   <tr>
  •     <td style="FONT-FAMILY: Arial" vAlign="top" bgColor="#99ff00">Your Name:</td>
  •     <td vAlign="top" bgColor="#66ffcc">
  • <input name="nameBox" type="text" id="nameBox" style="width:160px;" />
  • <span id="validateName" controltovalidate="nameBox"
  • errormessage="You must enter a name." display="None"
  • evaluationfunction="RequiredFieldValidatorEvaluateIsValid" initialvalue=""
  • style="color:Red;display:none;"></span>
  •     </td>
22
HTML, Page 6 (the calendar)
  • <td vAlign="center" bgColor="#ff9900" rowSpan="4">
  •    <table id="calendar" cellspacing="0" cellpadding="2" rules="all" border="1“
  •     style="background-color:White;border-width:1px;border-style:Double;font-
  •     family:Arial;font-size:Smaller;border-collapse:collapse;">
  •       <tr>
  •         <td colspan="7" style="background-color:Silver;">
  •           <table cellspacing="0" border="0" style="font-family:Arial;font-
  •           size:Smaller;width:100%;border-collapse:collapse;">
  •             <tr>
  •               <td style="width:15%;"><a href="javascript:__doPostBack('calendar','V912')“
  •                 style="color:Black">&lt;</a></td>
  •      …
  •               <td align="Center" style="width:14%;">
  •                 <a ref="javascript:__doPostBack('calendar','979')“style="color:Black">
  •                 6</a></td>
  •               <td align="Center" style="width:14%;">
  •         <a href="javascript:__doPostBack('calendar','980')" style="color:Black">
  •                 7</a></td>
  •             </tr>
  •           </table>
  •         </td>
  •       </tr>
23
HTML, Page 7 (the multi-select list)
  • <tr>
  •   <td style="FONT-FAMILY: Arial" vAlign="top" bgColor="#99ff00">Event Name:</td>
  •   <td vAlign="top" bgColor="#99ff99">
  •     <input name="eventBox" type="text" id="eventBox" style="width:160px;" />
  •     <span id="validateEvent" controltovalidate="eventBox"
  •       errormessage="You must enter an event name." display="None"
  •       evaluationfunction="RequiredFieldValidatorEvaluateIsValid“
  •        initialvalue="" style="color:Red;display:none;"></span>
  •   </td>
  • </tr>
  • <tr>
  •   <td style="FONT-FAMILY: Arial" vAlign="top" bgColor="#99ff00">Meeting Room:</td>
  •   <td vAlign="top" bgColor="#00ff99">
  •     <select name="roomList" id="roomList“ style="width:160px;">
  •       <option value="1">The Happy Room</option>
  •       <option value="2">The Angry Room</option>
  •       …
  •       <option value="20">The Sofa Room</option>
  •     </select>
  •     <span id="validateRoom" controltovalidate="roomList“
  •      errormessage="You must select a room." display="None"
  •      evaluationfunction="RequiredFieldValidatorEvaluateIsValid“
  •      initialvalue="" style="color:Red;display:none;"></span>
  •   </td>
  • </tr>                                                           AND MUCH MORE…






24
Binding a web control to data
  • We examined the HTML + controls in this application (the Webform1.aspx page), and the the actual HTML sent to the browser.  We will now examine the code behind the HTML + controls in the page (Webform1.aspx.cs) by acutally running Visual Studio .NET (not in these slides), and will use the visual interface to change properties of a control.  We will see that this code attaches data to the controls in the page as follows:


  • // create the dataset to hold the data
  • System.Data.DataSet oDS=new System.Data.DataSet();
  • // connect to the database
  • System.Data.SqlClient.SqlConnection oSqlClient=new
  •    System.Data.SqlClient.SqlConnection(“DB connect string”);
  • // create the query to be run
  • System.Data.SqlClient.SqlDataAdapter oSqlDA=new
  •   System.Data.SqlClient.SqlDataAdapter(“sql query”,oSqlClient);
  • oDS.Clear();   /* optional – only needed if previously filled */
  • // run the query to fill up a table in the data set
  • oSqlDA.Fill(oDS,“table_name");
  • // tell the control which table in the data set is connected to the control
  • oGrid.DataSource = oDS.Tables["table_name"];
  • // load the data into the control
  • oGrid.DataBind();
25
Benchmarks of Simple Web Pages:
Add #s to 10,000,000 - ASP and ASPX (VB)
  • <%@ Page language="VB" debug="false" %>
  • <%
  • Response.Write("Start <br>")
  • 'DIM i,j,nStart
  • DIM i AS Integer,j AS Long,nStart AS Double
  • nStart=TIMER
  • j=0
  • FOR i=1 TO 1000000
  •   j=j+i
  • NEXT
  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(j)+"<br>")
  • %>


  • For ASP, omit first (<%@ …>) line and the DIM i AS … line.  FOR ASPX, include the
  • first line and only one of the two DIM lines.


  • On 850 MHz PIII:
  • ASP - 1.2 seconds;
  • ASPX with DIM i,j,nStart - 1.2 sec;
  • ASPX with DIM i AS Integer,j AS Long,nStart AS Double
  • (no “variant” data types) - 0.010 sec.
26
Add #s to 10,000,000 - ASPX (C#)
  • <%@ Page language="C#" debug="false" %>
  • <%
  • Response.Write("Start "+System.DateTime.Now.ToString()+"<br>");
  • int i;
  • long j=0,start;
  • start=System.DateTime.Now.Ticks;
  • for (i=1;i<=1000000;i++) {j=j+i;}
  • Response.Write("Done "+((System.DateTime.Now.Ticks-start)/10000000.0).ToString()+
  •  "s "+j.ToString()+"<br>");
  • %>


  • On 850 MHz PIII: 0.010 seconds (same as VB with no variant data types)
27
Concatenate 10,000 strings: ASP
  • <%
  • Response.Write("Start "+CSTR(NOW())+"<br>")
  • DIM s,i,nStart
  • nStart=TIMER
  • s=""
  • FOR i=1 TO 20000
  •   s=s+CSTR(i)
  • NEXT
  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(LEN(s))+" 20,000<br>")
  • %>


  • On 850 MHz PIII: 7.5 seconds
28
Concatenate 10,000 strings: ASPX (VB)
  • <%@ Page language="VB" debug="false" %>
  • <%
  • Response.Write("Start "+CSTR(NOW())+"<br>")
  • DIM s AS String,i AS Integer,nStart AS Double
  • nStart=TIMER
  • s=""
  • FOR i=1 TO 20000
  •   s=s+CSTR(i)
  • NEXT
  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(LEN(s))+" 20,000<br>")
  • %>


  • On 850 MHz PIII: 21.6 seconds (longer because strings are recopied)


29
Concatenate 10,000 strings: ASPX (VB, StringBuilder)
  • <%@ Page language="VB" debug="false" %>
  • <%
  • Response.Write("Start "+CSTR(NOW())+"<br>")
  • DIM i AS Integer,nStart AS Double
  • DIM s AS System.Text.StringBuilder
  • s=NEW System.Text.StringBuilder(10000)
  • nStart=TIMER
  • FOR j=1 TO 10
  •   s.Remove(0,s.Length)
  •   FOR i=1 TO 20000
  •     s.Append(CSTR(i))
  •   NEXT
  • NEXT
  • Response.Write("Done "+((TIMER-nStart)/10).ToString()+" "+CSTR(LEN(s.ToString()))+" 20,000<br>")
  • %>


  • On 850 MHz PIII: 0.026 seconds
30
Concatenate 10,000 strings: ASPX (C#, StringBuilder)
  • <%@ Page language="C#" debug="true" %>
  • <%
  •   System.Int32 i=0;int j=0;long start=System.DateTime.Now.Ticks;
  •   System.Text.StringBuilder s=new System.Text.StringBuilder(10000);
  •   this.Response.Write("Start <br>");
  •   for (j=0;j<10;j++) {s.Remove(0,s.Length);
  •   for (i=0;i<nCount;i++) {s.Append(i.ToString());};}
  •   this.Response.Write("Done "+((System.DateTime.Now.Ticks-start)/
  •     10000000.0/10).ToString()+"s "+s.ToString().Length.ToString()+" "+i.ToString()+"<br>");
  • %>


  • On 850 MHz PIII: 0.026 seconds


31
Load table from SQLServer: ASP
  • <%
  • Const adOpenStatic = 3
  • DIM nStart,oConn,oRS,cFields
  • cFields="_ID,Appointment_Notes FROM Visit_"
  • cFields="* FROM Visit_"
  • nStart=TIMER
  • Response.Write("Start "+CSTR(NOW())+"<br>")
  • SET oConn = Server.CreateObject("ADODB.Connection")
  • oConn.Open "DRIVER={SQL Server};SERVER=(local);DATABASE=test;UID=user;Password=pass;"
  • SET oRS = Server.CreateObject("ADODB.Recordset")
  • oRS.Open "SELECT "+cFields+" WHERE Appointment_Notes IS NOT NULL", _
  •   oConn,adOpenStatic
  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(oRS.RecordCount)+"<br>")
  • %>


  • On 850 MHz PIII: First cFields list gives .25, second gives .70 seconds
32
Load table from SQLServer: ASPX in compatibility mode
  • <%@ Page language="VB" debug="true" aspcompat="true" %>
  • <%
  • Const adOpenStatic = 3
  • DIM cFields AS String,nStart AS Double,oConn AS Object,oRS AS Object
  • cFields="_ID,Appointment_Notes FROM Visit_"
  • cFields="* FROM Visit_"
  • nStart=TIMER
  • Response.Write("Start "+CSTR(NOW())+"<br>")


  • oConn=Server.CreateObject("ADODB.Connection")
  • oConn.Open("DRIVER={SQL Server};SERVER=(local);DATABASE=test;UID=user;Password=pass;")
  • oRS=Server.CreateObject("ADODB.Recordset")
  • oRS.Open("SELECT "+cFields+" WHERE Appointment_Notes IS NOT NULL",oConn,adOpenStatic)


  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(oRS.RecordCount)+"<br>")


  • 'must close explicitly or subsequent page access will be slow (because of delayed
  • 'garbage collection??)
  • oRS.Close
  • oConn.Close
  • %>


  • On 850 MHz PIII: First cFields list gives .25, second gives .70 seconds
33
Load table from SQLServer: ASPX data sets
  • <%@ Page language="VB" debug="true"%>
  • <%
  • Const adOpenStatic = 3
  • DIM nStart AS Double
  • DIM oDS AS System.Data.DataSet
  • DIM oOleDB AS System.Data.OleDb.OleDbConnection
  • DIM oSqlClient AS System.Data.SqlClient.SqlConnection
  • DIM oOleDA AS System.Data.OleDb.OleDbDataAdapter
  • DIM oSqlDA AS System.Data.SqlClient.SqlDataAdapter
  • DIM oRows AS System.Data.DataRowCollection
  • DIM cFields AS String
  • cFields="_ID,Appointment_Notes FROM Visit_"
  • cFields="* FROM Visit_"


  • nStart=TIMER
  • oDS=new System.Data.DataSet()
  • oDS.Clear
  • Response.Write("Created data set "+CSTR(TIMER-nStart)+"<br>")
  • oOleDB=new System.Data.OleDb.OleDbConnection("Provider=SQLOLEDB;"+ _
  •   "SERVER=(local);DATABASE=test;UID=user;Password=pass;")
  • oSqlClient=new System.Data.SqlClient.SqlConnection( _
  •   "SERVER=(local);DATABASE=test;UID=user;Password=pass;")


34
Load table from SQLServer: ASPX data sets con’t
  • oOleDA=new System.Data.OleDb.OleDbDataAdapter( _
  •   "SELECT "+cFields+" WHERE Appointment_Notes IS NOT NULL", _
  •   oOleDB)
  • oSqlDA=new System.Data.SqlClient.SqlDataAdapter( _
  •   "SELECT "+cFields+" WHERE Appointment_Notes IS NOT NULL", _
  •   oSqlClient)
  • Response.Write("Created data adapters "+CSTR(TIMER-nStart)+"<br>")
  • oOleDA.Fill(oDS,"History")
  • Response.Write("Loaded dataset table "+CSTR(TIMER-nStart)+"<br>")
  • oDS.Clear()
  • nStart=TIMER
  • oSqlDA.Fill(oDS,"History")
  • Response.Write("Loaded dataset table "+CSTR(TIMER-nStart)+"<br>")
  • oRows=oDS.Tables("History").Rows
  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(oRows.Count)+"<br>")


  • 'must close explicitly or subsequent page access will be slow (because of delayed
  • 'garbage collection??)
  • oOleDB.Close()
  • oSqlClient.Close()
  • oDS.Clear()
  • %>


  • On 850 MHz PIII: First cFields list gives (OleDB) .25s, (SQLClient) .18s [compare ASP at .25s]
  • Second cFields list gives (OleDB) 1.7s, (SQLClient) .88s [compare asp at .70s]


35
Load table from SQLServer: ASPX data sets, C#
  • <%@ Page language="C#" debug="true"%><%
  • int i; long j=0,k=0; string cNotes; object oField; string cFields;
  • long nStart=System.DateTime.Now.Ticks;
  • cFields="_ID,Appointment_Notes FROM Visit_"; cFields="* FROM Visit_";
  • System.Data.DataRowCollection oRows=
  •   GetData("SERVER=(local);DATABASE=test;UID=user;Password=pass;",
  •   "SELECT "+cFields+" WHERE Appointment_Notes IS NOT NULL");
  • Response.Write("Done "+((System.DateTime.Now.Ticks-nStart)/10000000.0).ToString()+
  •   " "+oRows.Count.ToString()+"<br>");
  • %>
  • <script runat="server">
  • System.Data.DataRowCollection GetData(string lcConnection,string lcQuery) {
  •   System.Data.DataSet oDS=new System.Data.DataSet();
  •   System.Data.SqlClient.SqlConnection oSqlClient=
  •     new System.Data.SqlClient.SqlConnection(lcConnection);
  •   System.Data.SqlClient.SqlDataAdapter oSqlDA=
  •     new System.Data.SqlClient.SqlDataAdapter(lcQuery,oSqlClient);
  •   oDS.Clear();
  •   oSqlDA.Fill(oDS,"History");
  •   return oDS.Tables["History"].Rows;}
  • </script>


  • On 850 MHz PIII: First cFields list gives (SQLClient) .18s [compare ASP at .25s]
  • Second cFields list (SQLClient) .98s [compare asp at .70s]
36
Use data from SQLServer: ASP
  • <%
  • Const adOpenStatic = 3
  • DIM nStart,oConn,oRS,i,j,k,cNotes,oField
  • nStart=TIMER
  • Response.Write("Start "+CSTR(NOW())+"<br>")
  • SET oConn = Server.CreateObject("ADODB.Connection")
  • oConn.Open "DRIVER={SQL Server};SERVER=(local);"+ _
  •   "DATABASE=test;UID=user;Password=pass;"
  • SET oRS = Server.CreateObject("ADODB.Recordset")
  • oRS.Open "SELECT _ID,Appointment_Notes FROM Visit_",oConn ',adOpenStatic
  • j=0
  • k=0
  • DO WHILE NOT oRS.EOF
  •   j=j+oRS("_ID").Value
  •   cNotes=oRS("Appointment_Notes").Value
  •   IF NOT ISNULL(cNotes) THEN
  •     k=k+LEN(cNotes)
  •   END IF
  •   IF NOT ISNULL(cString) THEN k=k+LEN(cString)
  •   oRS.MoveNext
  • LOOP
  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(j)+" "+CSTR(k)+"<br>")
  • %>


  • On 850 MHz PIII: 2.2 seconds, 26 seconds if adOpenStatic parameter is included (to be able to
  • count rows and navigate back and forth in the record set).


37
Use data from SQLServer: ASPX record sets
  • <%@ Page language="VB" debug="true" aspcompat="true" %>
  • <%
  • Const adOpenStatic = 3
  • DIM nStart AS Long,i AS Integer,j AS Long,k AS Long,cNotes AS String
  • DIM oField AS Object
  • nStart=TIMER
  • Response.Write("Start "+CSTR(NOW())+"<br>")
  • DIM oConn = Server.CreateObject("ADODB.Connection")
  • oConn.Open("DRIVER={SQL Server};SERVER=(local);DATABASE=test;UID=user;Password=pass;")
  • DIM oRS = Server.CreateObject("ADODB.Recordset")
  • oRS.Open("SELECT _ID,Appointment_Notes FROM Visit_",oConn) ',adOpenStatic)
  • Response.Write(oRS.RecordCount)
  • j=0
  • k=0
  • DO WHILE NOT oRS.EOF
  •   j=j+oRS("_ID").Value
  •   oField=oRS("Appointment_Notes")
  •   IF oField.ActualSize>0
  •     cNotes=oField.Value
  •     k=k+LEN(cNotes)
  •   END IF
  •   oRS.MoveNext
  • LOOP
  • Response.Write("Done "+CSTR(TIMER-nStart)+" "+CSTR(j)+" "+CSTR(k)+"<br>")
  • %>


  • On 850 MHz PIII: 4.2 seconds, 26 seconds if adOpenStatic parameter is included (to be able to
  • count rows and navigate back and forth in the record set).
38
Use data from SQLServer: ASPX data sets
  • <%@ Page language="C#" debug="true" aspcompat="true" %><%
  • int i; long j=0,k=0; string cNotes; object oField; long nStart=System.DateTime.Now.Ticks;
  • System.Data.DataRowCollection oRows=GetData(
  •   "SERVER=(local);DATABASE=test;UID=user;Password=pass;",
  •   "SELECT _ID,Appointment_Notes FROM Visit_");
  • foreach (System.Data.DataRow oRow in oRows) {
  •   j=j+(int)oRow["_ID"];
  •   if (!oRow.IsNull("Appointment_Notes")) {cNotes=(string)oRow["Appointment_Notes"];k=k+cNotes.Length;}
  • }
  • Response.Write("Done "+((System.DateTime.Now.Ticks-nStart)/10000000.0).ToString()+
  •   " "+j.ToString()+" "+k.ToString()+"<br>");
  • %>
  • <script runat="server">
  • System.Data.DataRowCollection GetData(string lcConnection,string lcQuery) {
  •   System.Data.DataSet oDS=new System.Data.DataSet();
  •   System.Data.SqlClient.SqlConnection oSqlClient=
  •     new System.Data.SqlClient.SqlConnection(lcConnection);
  •   System.Data.SqlClient.SqlDataAdapter oSqlDA=
  •     new System.Data.SqlClient.SqlDataAdapter(lcQuery,oSqlClient);
  •   oDS.Clear();
  •   oSqlDA.Fill(oDS,"History");
  •   return oDS.Tables["History"].Rows;
  • }
  • </script>


  • On 850 MHz PIII: 0.5 seconds
39
Conclusions
  • Visual Studio .NET (and a simpler system called Web Matrix – see www.asp.net) have nice visual objects that are connected by a framework to C# (or VB) code to respond to user actions and set properties; these frameworks are supported by ASP.NET and DLLs on the server
  • ASP.NET also allows the programmer to generate web pages according to proprietary software models
  • ASP data access and ASP.NET data access (compatibility mode) are similar in speed
  • ASP.NET data sets (ADO.NET) can be slower to fetch records
  • ASP.NET with ADO.NET is faster if the data values in fetched records are actually used
  • ASP (VBScript) uses only variant data types.  ASPX (VB), when using variant data types (DIM xxx -- not DIM xxx AS Type), is the same speed as ASP!
  • ASP.NET (VB) with declared data types is the same speed as C#
  • ASP.NET (VB) and ASP.NET (C#) share similar syntax for declaring and accessing accessing types, classes, and methods