<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-619507307257852537</id><updated>2012-02-17T00:18:53.304+10:00</updated><title type='text'>Bracora</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-5338454914488574332</id><published>2010-08-06T14:40:00.001+10:00</published><updated>2010-08-06T14:40:49.066+10:00</updated><title type='text'>Moved</title><content type='html'>In the process of moving my content to blogger..coming soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-5338454914488574332?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/5338454914488574332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2010/08/moved.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/5338454914488574332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/5338454914488574332'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2010/08/moved.html' title='Moved'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-7013706783328648877</id><published>2008-08-19T16:34:00.000+10:00</published><updated>2010-08-15T16:34:55.279+10:00</updated><title type='text'>Mastering iTunes using Linq To Xml</title><content type='html'>&lt;p&gt;Last updated : 19th August 2008 &lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;Lets us assume for this scenario that we are adding a new feature to our web dating web site. Yes, let's presume that we already match people based on their interests etc but what if we could match them based on the music they like. In fact, what if we could scan their iTunes library and see what kind of music they listen to most often and match this against other daters listening habits? Wouldn't that be a good proposition?&lt;/p&gt; &lt;p&gt;Just about everyone I know has an apple music product of some description which inevitably means they will have iTunes installed to manage this.&amp;nbsp; But how do we get to this information? Fortunately, all this music data is stored within an XML document maintained by iTunes. The format of this data is not ideal though. The music data is stored within a &amp;lt;dict&amp;gt; node that contains all of its data in a pair of nodes that are similar in structure to a key value pair. I have shown this below.&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="iTunesStructure" border="0" alt="iTunesStructure" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TGeKgdT-ScI/AAAAAAAAF6M/kxkIUbaNuO4/iTunesStructure%5B3%5D.jpg?imgmax=800" width="604" height="623"&gt; &lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;To enable this matching we need to provide a facility to upload a daters iTunes Music Library information which includes all the music they have along with all the usage data as well. This will allow us to search through this information and use it on our web site. All this information is stored in an XML file called, funny enough, iTunes Music Library. Now, to help us extrapolate this data we will use a nice new feature of the .Net Framework 3.5 called Language Integrated Query (LINQ). More specifically we'll use LINQ to XML, as this provides a simple way to interrogate XML data using simple queries which look a lot like standard SQL.&lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;Before we start, let's have a look at how the final web site will look. In the figure below you will see that users are provided with a simple interface to upload their iTunes XML file. When they click on the Find Me My Match button, the system will :&lt;/p&gt; &lt;ol style="list-style-type: decimal"&gt; &lt;li&gt;Upload this file  &lt;li&gt;Parse the file for the current users favourite tracks  &lt;li&gt;Match this against a simulated database of users  &lt;li&gt;The system will then make a decision about who would be the best match &lt;/li&gt;&lt;/ol&gt; &lt;p style="text-align: center"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="FinishedSite-2" border="0" alt="FinishedSite-2" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TGeKhBIlGPI/AAAAAAAAF6Q/hENbFNpz2ME/FinishedSite-2%5B2%5D.jpg?imgmax=800" width="604" height="632"&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In Visual Studio we need to create a new web application. We need to make sure that we select .Net framework 3.5 and we will use VB.NET for this demo.&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="New2008Project" border="0" alt="New2008Project" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TGeKhiPBFiI/AAAAAAAAF6U/UcrBMmcAkm8/New2008Project%5B3%5D.jpg?imgmax=800" width="604" height="401"&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;To save a load of time on the user interface I downloaded a free web site template from &lt;a href="http://anvisionwebtemplates.com/enter.php?url=http%3A//anvisionwebtemplates.com/" target="_blank"&gt;AnVisionWebTemplates.com&lt;/a&gt;. This template gives us the html blueprint for our design and we only need to add the upload functionality into the overall website application. You would normally spend a bit of time to take out the common html elements and place them into a master page or pages. I have just copied this into my directory structure and modified the aspx page that I'll be using. You can download the files in this article from the link provided above.&lt;/p&gt; &lt;p&gt;The Project structure should resemble the figure below:&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="FolderStructure" border="0" alt="FolderStructure" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TGeKiRXvLeI/AAAAAAAAF6Y/OujE1CbfW_I/FolderStructure%5B2%5D.jpg?imgmax=800" width="267" height="370"&gt; &lt;/p&gt; &lt;p&gt;I have created a simple XML file called userdb.xml and this is simulating a database of users that we may have on our dating website. The structure of this file is shown below:&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="UserDatabase" border="0" alt="UserDatabase" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TGeKi0AB29I/AAAAAAAAF6c/Vdd2a6a0r3c/UserDatabase%5B2%5D.jpg?imgmax=800" width="518" height="502"&gt; &lt;/p&gt; &lt;p&gt;Next we want to create a class to do all the work. In the App_Code folder I created a new class called Bracora.Matchmarker that will be implementing the couple of static methods we need.&lt;/p&gt; &lt;div class="codebox"&gt; &lt;div&gt;&lt;pre&gt;       &lt;br /&gt;                &lt;!-- paste here --&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; General class for demo&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Note: you would want to seperate the logic out into seperate classes (tiers)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; in a real world application&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NotInheritable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt; MatchMaker&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Don't instantiate&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;            &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Now let's start using some of this lovely Linq functionality. The first method I want to implement is the one to upload all the user information in the usersdb XML file and use this as the basis for matching later on. For this simple demo, to match music I am merely looping through this information and performing a basic string comparison so I am returning a general IEnumerable interface for my simulated database. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;As you can see from the code below, I simply load the data into a XDocument object that is part of the Linq namespace. This allows me to run queries against this data as if it were held in a relational database. The query syntax is similar to SQL but slightly more intuitive. Another nice feature of .net 3.5 is the ability to return anonymous types. In the query below I am returning a strongly typed collection of objects containing two properties, userId and track. The compiler does all the hard work and saves me having to define this class just to return these values.&lt;/p&gt;&lt;br /&gt;&lt;div id="Div1" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;       &lt;br /&gt;        &lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;--&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; Get all the data we have in our simulated database. We would normally keep all this&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; information in a database. But this is fine for the demo.&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;A list of tracks an associated user ID's&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Just hard coding values for the demo&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; GetAllMusic() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; IEnumerable&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; databasePath &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; HttpContext.Current.Server.MapPath(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;App_Data&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/userdb.xml&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; System.IO.File.Exists(databasePath) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; userdb &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; XDocument.Load(databasePath)&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Just return a list of our simulated users&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; dbSongs &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; From s &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; userdb...&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;song&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                              Order By s.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;UserID&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Value _&lt;br /&gt;                              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                                s.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;UserID&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Value, _&lt;br /&gt;                                s.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;track&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Value&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; dbSongs&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;            &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The next thing I need to do is create a method that will read through an uploaded iTunes library document and grab the top 25 songs most often played. Again, using Linq to XML this is an easy task.&lt;/p&gt;&lt;br /&gt;&lt;div id="Div2" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;       &lt;br /&gt;        &lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;--&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; Process the uploaded file and get the top tracks baced on how often they&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; are played. In a real world we perform this processing offline.&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="iTunesFile"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;The file location of the uploaded iTunes file&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;A list of top songs for that user&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;We are only taking the bare minimun information for this example.&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; Note how LINQ feturns a generic list of anonymous types without us having to&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; create a class definition for this ;-)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; GetUsersTopTracks(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; iTunesFile &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; IEnumerable&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; System.IO.File.Exists(iTunesFile) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; iTunes &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; XDocument.Load(iTunesFile)&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Drill into the iTunes XML structure to get the music information&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Transform it into a more meaningful XML structure&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; tracks &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; From t &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; iTunes.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;plist&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;dict&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;dict&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;dict&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; XElement(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;song&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;                                 From key &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; t.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;key&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                                 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; XElement(key.Value.ToString.Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;span style="color: #000000"&gt;), _&lt;br /&gt;                                 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;CType&lt;/span&gt;&lt;span style="color: #000000"&gt;(key.NextNode, XElement).Value.ToString))&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Get the top 25 most played songs&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; topTracks &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; From song &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; tracks _&lt;br /&gt;                                Order By song.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayCount&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Value Descending _&lt;br /&gt;                                Take (&lt;/span&gt;&lt;span style="color: #800080"&gt;25&lt;/span&gt;&lt;span style="color: #000000"&gt;) _&lt;br /&gt;                             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                                Artist &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; song.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Artist&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Value, _&lt;br /&gt;                                TrackName &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; song.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Value&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; topTracks&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;There are a couple of things to note here. You will notice that I am drilling into the iTunes XML structure using what is known as Child Axis properties. VB.NET provides me with this syntax. The line of code (iTunes.&amp;lt;plist&amp;gt;.&amp;lt;dict&amp;gt;.&amp;lt;dict&amp;gt;.&amp;lt;dict&amp;gt;) is basically me drilling into where the music information is stored within the file hierarchy. I don't like the way iTunes manages this data so I am taking this raw information and transforming it into an XML structure that works for me. After I do this I am then sorting on descending Playcount value and then taking the top 25 songs. Again, I am simply returning a strongly typed collection of objects that contain 2 properties, Artist and Trackname.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And now for the matching routine....&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To hold the matching data I have created a simple class.&lt;/p&gt;&lt;br /&gt;&lt;div id="Div4" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;       &lt;br /&gt;&lt;!--&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Demo&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt; MatchedEntry&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _userID &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; UserId() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _userID&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                _userID &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _trackName &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; TrackName() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _trackName&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                _trackName &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Namespace&lt;/span&gt;                                     &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;All I want to do now is pass in two lists to a routine, one with the top 25 music tracks for the current user and another list that contains our simulated database with all of our stored users favourite selections. We then loop through the data and store all matches in a generic list of MatchedEntry objects. From here we run a Linq query to group and sort the matches based on the most 'hits' and then we select the first or top match.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If we have a valid match at this stage, we then execute another Linq query that gathers all the music tracks that were common to both users. So we now have a userId and an array of tracks that were matched (Note the .ToArray() method on the Linq object). Now thank you .net 3.5, we now just create an anonymous type with this information and return it back :-)&lt;/p&gt;&lt;br /&gt;&lt;div id="Div3" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;       &lt;br /&gt;                                            &lt;!--Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/ --&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; Attempts to find the most matched user based on checking their music information&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; against the music information we have in our simulated database&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="userTracks"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;A list of user tracks to match&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="dbTracks"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;A list of music tracks against users we have in our 'database'&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;The best matched userID or nothing for no matches&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;Don't try this at home. Honestly there are much better ways to do this!&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; GetTopMatchedUser(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; userTracks &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; IEnumerable, _&lt;br /&gt;                                                 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; dbTracks &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; IEnumerable) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; contains a list of non-unique userIDs when songs are matched&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; MusicMatches &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; Generic.List(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Of&lt;/span&gt;&lt;span style="color: #000000"&gt; MatchedEntry)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; Match &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; MatchedEntry &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; loop round each of the users favourite tracks and try to match this&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; against the list of tracks we have in our  simulated database. If&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; a match occurs the add the userId. The more instances of that userId&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; then the more music they have in common.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Each&lt;/span&gt;&lt;span style="color: #000000"&gt; track &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; userTracks&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Each&lt;/span&gt;&lt;span style="color: #000000"&gt; song &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; dbTracks&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; track.TrackName &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; song.track &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        Match &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; MatchedEntry()&lt;br /&gt;                        Match.UserId &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; song.UserID&lt;br /&gt;                        Match.TrackName &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; song.track&lt;br /&gt;                        MusicMatches.Add(Match)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Group by the userID and then work out the count for each one&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; top &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; From u &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; MusicMatches _&lt;br /&gt;                        Group By u.UserId Into g &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Group _&lt;br /&gt;                        Order By g.Count() Descending _&lt;br /&gt;                      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            UserId, _&lt;br /&gt;                            NumberOfMatches &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; g.Count()&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; top.Count() &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; topMatchedUser &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; top.First()&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Get the matched songs based on the userId&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; matchedSongs &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; From u &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; MusicMatches _&lt;br /&gt;                                    Where u.UserId &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; topMatchedUser.UserId _&lt;br /&gt;                                   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; u.TrackName Distinct&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; MatchedUser &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;With&lt;/span&gt;&lt;span style="color: #000000"&gt; {.User &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; topMatchedUser.UserId, .Songs &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; matchedSongs.ToArray}&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; MatchedUser&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;                                            &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;To finish up with this class we need to create a controller routine that ties all these methods together.......&lt;/p&gt;&lt;br /&gt;&lt;div id="Div5" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;       &lt;br /&gt;       &lt;!--Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/ --&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; Main entry point for the demo and controller &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; FindMeMyMatch(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; fileName &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; userSongs &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; IEnumerable &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetUsersTopTracks(fileName)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; allUsersSongs &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; IEnumerable &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetAllMusic()&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; GetTopMatchedUser(userSongs, allUsersSongs)&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;           &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Now, all we need to do now is implement the user interface. Therefore we need a FileUpload control, a few labels, an image control to show matched users and a button to trigger the whole thing off. The full details are contained in the download and I would encourage you to get it and run the application as there are no database requirements.&amp;nbsp; Below is the main routine that uploads the iTunes file and displays the outcomes, either matched or unmatched. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;One point to note is that ASP.NET constrains the upload size by default. As iTunes library files can be quite large, you'll need to modify the web.config file to increase the allowed upload size.&lt;/p&gt;&lt;br /&gt;&lt;div id="Div7" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;       &lt;br /&gt;&lt;!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com --&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;!-- need to increase the size of the permitted upload size --&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;httpRuntime &lt;/span&gt;&lt;span style="color: #ff0000"&gt;maxRequestLength&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="20480"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Here is the code behind for the web page. It's pretty straight forward. &lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;We check that it's a proper XML file &lt;br /&gt;&lt;li&gt;We generate a new unique filename and save the uploaded file &lt;br /&gt;&lt;li&gt;We then pass the filename to the matching routine and await our fate! &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;I have coded some simple display logic for the demo. But we either match or we don't and display accordingly.&lt;/p&gt;&lt;br /&gt;&lt;div id="Div6" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;       &lt;!--Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/ --&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; btnUpload_Click(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.EventArgs) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; btnUpload.Click&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; savePath &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; HttpContext.Current.Server.MapPath(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;uploads&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; (FileUpload1.HasFile) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;make sure it's an XML file&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; (FileUpload1.PostedFile.ContentType.ToLower &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;text/xml&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                message.Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;This is not a valid iTunes file. Please make sure you upload the proper file.&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Exit Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; create a unique name for the uploaded file.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; fileName &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Guid.NewGuid().ToString &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;.xml&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Append the name of the file to upload to the path.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            savePath &lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; fileName&lt;br /&gt;&lt;br /&gt;            FileUpload1.SaveAs(savePath)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; MyMatch &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Demo.MatchMaker.FindMeMyMatch(savePath)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; HeaderText &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;.Empty&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; ImageOfMatchedUserUrl &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;.Empty&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; DisplaySongs &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;.Empty&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; MyMatch &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Case&lt;/span&gt;&lt;span style="color: #000000"&gt; MyMatch.User&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        ImageOfMatchedUserUrl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;App_Themes/Standard/images/user1.jpg&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;2&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        ImageOfMatchedUserUrl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;App_Themes/Standard/images/user2.jpg&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;3&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        ImageOfMatchedUserUrl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;App_Themes/Standard/images/user3.jpg&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        ImageOfMatchedUserUrl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;App_Themes/Standard/images/user4.jpg&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;To&lt;/span&gt;&lt;span style="color: #000000"&gt; MyMatch.Songs.Length() &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    DisplaySongs &lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;li&amp;gt;{0}&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, MyMatch.Songs(i))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                HeaderText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;h3&amp;gt;{0}&amp;lt;/h3&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Success, we found a match!&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; No matches show the user who has been waiting longest :-)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                ImageOfMatchedUserUrl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;App_Themes/Standard/images/user4.jpg&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                DisplaySongs &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;li&amp;gt;{0}&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;You have no songs in common, here is your closest match&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                HeaderText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;h3&amp;gt;{0}&amp;lt;/h3&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;No luck I'm afraid!&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.headerMatch.Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; HeaderText&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.songList.Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DisplaySongs&lt;br /&gt;            imageOfMatchedUser.ImageUrl &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ImageOfMatchedUserUrl&lt;br /&gt;            imageOfMatchedUser.Visible &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Error message for no file&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            message.Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;p class=""error""&amp;gt;You did not specify an iTunes file to upload.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;            &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;And that's all there is to it. Linq to Xml is a wonderfully powerful addition to the .net framework.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Hopefuly this tutorial has shown how you might use Linq in your own applications. Linq to XML is really nice feature and makes working with XML documents really easy. The leaning curve is very smooth and you can quickly pick up the core concepts without too much effort and grow into the more complex aspects of Linq namespace later on.&lt;/p&gt;&lt;br /&gt;&lt;p&gt; The code download also contains a few sample iTunes in the upload directory.&lt;/p&gt;&lt;br /&gt;&lt;p style="font-style: italic"&gt;Note: iPod® and iTunes® are registered trademarks of Apple Inc. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-7013706783328648877?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/7013706783328648877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2008/08/mastering-itunes-using-linq-to-xml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/7013706783328648877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/7013706783328648877'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2008/08/mastering-itunes-using-linq-to-xml.html' title='Mastering iTunes using Linq To Xml'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_BYGp_3Y5xXE/TGeKgdT-ScI/AAAAAAAAF6M/kxkIUbaNuO4/s72-c/iTunesStructure%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-2870363419387764350</id><published>2007-11-05T16:47:00.000+10:00</published><updated>2010-08-15T16:47:16.960+10:00</updated><title type='text'>Generic GridView Delete Strategy</title><content type='html'>&lt;p&gt;Last updated : 5th November 2007&lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;There are a number of ways to implement a JavaScript delete confirmation in a GridView. Most of these involve changing the command columns on the GridView into template columns. From here you can either add the onClientClick code to the template directly or search for the control on the row data bound event of the gridview.&lt;/p&gt; &lt;p&gt;Below is a way to get this done in a re-usable way without having to change each pages GridView command columns.&lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;We want to create a shared (VB) or static (C#) method that can be used by all pages within the web application. We will still utilise the RowDataBound event but we will encapsulate this functionality and call the method with a single line of code.&lt;/p&gt; &lt;p&gt;We will be using a ObjectDataSource connected to a Gridview to demonstrate this.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;I have extracted a slimmed version of the Categories table in Northwind and saved it as XML for this article. I have provided the source code so I'll not be covering the simple Data object class.&lt;/p&gt; &lt;p&gt;Firstly we want to create a re-usable routine that can be called from any page. Each page may vary the command column location on the GridView. Some users like this to be the first column on the left, others prefer the 'Edit', 'Delete' commands to be on the right. Therefore we need to keep this flexible to prevent excessive control look-ups on the RowDataBound events. The completed code is shown below: &lt;/p&gt; &lt;div class="codebox"&gt; &lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NotInheritable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt; GridViewHelper&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; Adds a javascript pop-up delete confirmation message to ANY LinkButton control &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; found in the passed column index that has a text value of Delete&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="deleteColumnIndex"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;the column you wish to &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; restrict your search for a Delete LinkButton control&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="e"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;The GridView row agruments when the GridView is in RowDataBound&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;'''&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; AddDeleteConfirmation(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; deleteColumnIndex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; GridViewRowEventArgs)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;' Check you are only working with Data Rows, not headers/footers&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; e.Row.RowType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DataControlRowType.DataRow &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;' Loop through each control in the GridView command column&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Each&lt;/span&gt;&lt;span style="color: #000000"&gt; ctl &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Control &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; e.Row.Cells(deleteColumnIndex).Controls&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;' If it is a LinkButton with a text value of Delete then add the confirmation message.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;TypeOf&lt;/span&gt;&lt;span style="color: #000000"&gt; (ctl) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Is&lt;/span&gt;&lt;span style="color: #000000"&gt; LinkButton &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; DeleteLink &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; LinkButton &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;CType&lt;/span&gt;&lt;span style="color: #000000"&gt;(ctl, LinkButton)&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; DeleteLink.Text.ToLower &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;delete&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                            DeleteLink.Attributes.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;onclick&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;                                                   &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;return confirm(""Are you sure you wish to delete this record?"")&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;&lt;span style="color: #000000"&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Exception&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; just ignore for deployment. May want to re-throw for development.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Class&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Now, we want to hook this up to our GridViews.&amp;nbsp; We will use the RowDataBound event to loop through the LinkButton controls on the command column of the GridView. If it finds one that has a text value of 'delete' it will add the necessary JavaScript to provide users with the delete confirmation message box. The code is shown below:&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; GridView1_RowDataBound(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;                                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.UI.WebControls.GridViewRowEventArgs) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; GridView1.RowDataBound&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;' The command buttons are in the first column (zero index)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        GridViewHelper.AddDeleteConfirmation(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;, e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The finished article will produce the following results:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DeleteConfirmationPopUp" border="0" alt="DeleteConfirmationPopUp" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TGeNcwBnJQI/AAAAAAAAF6k/1VlYiUt5n8w/DeleteConfirmationPopUp%5B3%5D.gif?imgmax=800" width="604" height="296"&gt; &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;As you can see this provides the basis of a generic delete pop-up confirmation routine that you can use without having to convert your command column to template fields. You can further extend this by passing 'unique' row information to provide a more detailed message to the client.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-2870363419387764350?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/2870363419387764350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2007/11/generic-gridview-delete-strategy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/2870363419387764350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/2870363419387764350'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2007/11/generic-gridview-delete-strategy.html' title='Generic GridView Delete Strategy'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_BYGp_3Y5xXE/TGeNcwBnJQI/AAAAAAAAF6k/1VlYiUt5n8w/s72-c/DeleteConfirmationPopUp%5B3%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-3273199191532043859</id><published>2007-10-11T13:46:00.000+10:00</published><updated>2010-08-07T13:57:34.220+10:00</updated><title type='text'>Create A Data Access Layer (DAL) without writing any code</title><content type='html'>&lt;p&gt;Last updated : 11th October 2007&lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;You spend a lot of your time writing very repetitive code just to grind out standard objects that mirror your database tables and all of the CRUD operations that goes along with this. If only there was a way to take care of this and allow us to dive straight into the business logic and UI functionality. Well this article will present one solution. &lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;We will be using the Repository Factory Package from the Microsoft Patterns &amp;amp; Practices Team to create our data access layer. The Repository Factory is a CodePlex project that integrates with Visual Studio and it can be used to generate all our business objects, stored procedures and data access code. &lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;To implement the features in this article you require the following.&lt;/p&gt; &lt;p&gt;Pre-requisites:&lt;br&gt;Visual Studio with SP1 (Need to support web applications projects) &lt;br&gt;A build of Repository Factory Package &lt;br&gt;Guidance Automation Tools for Visual Studio (GAT and GAX July 2007 CTP) &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Note: - This article cannot be used with any of the Visual Studio Express Versions.&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;In this example we will create a simple web application that can be used to monitor the power capacity of computer racks based in data centres. The database schema is very straightforward and concurrency is not an issue. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="schema" border="0" alt="schema" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWEYn6vEI/AAAAAAAAFxk/1Dlhl-mF2a8/schema%5B4%5D.gif?imgmax=800" width="604" height="261"&gt; &lt;/p&gt; &lt;p&gt;Each Rack can accommodate a number of servers to a maximum power capacity. Each Rack is housed in a Cabinet that can contain up to 20 Racks. Each Cabinet is located on a Floor and in a particular Location. Each Rack can be assigned to a customer and may have one or more power sources.&lt;/p&gt; &lt;p&gt;At this stage we have the database designed. So now we want to generate all the grunt code so we can go straight into coding the business rules. So how doe we do it?&lt;/p&gt; &lt;h3&gt;Step 1 - Download and Install the Repository Factory Package&lt;/h3&gt; &lt;p&gt;Go to &lt;a title="Repository Factory" href="http://www.codeplex.com/RepositoryFactory" target="_blank"&gt;http://www.codeplex.com/RepositoryFactory&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Click on the releases Tab and download the latest MSI release.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="codeplexDownload" border="0" alt="codeplexDownload" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWExG7W_I/AAAAAAAAFxo/RcMyvMhGodc/codeplexDownload%5B4%5D.gif?imgmax=800" width="604" height="439"&gt; &lt;/p&gt; &lt;p&gt;Close any Visual Studio windows and run the MSI. This will Install the Repository Package on your machine. &lt;/p&gt; &lt;h3&gt;Step 2 - Install Guidance Automation Extensions and Guidance Automation Toolkit&lt;/h3&gt; &lt;p&gt;Download and install both of these Microsoft products to let you run guidance packages with Visual Studio. &lt;br&gt;&lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718949.aspx" target="_blank"&gt;GAT and GAX July 2007 CTP Download.&lt;/a&gt; &lt;/p&gt; &lt;h3&gt;Step 3 - Create the Visual Studio Project Structure&lt;/h3&gt; &lt;p&gt;The Repository Package generates all the user code in C#. However if you are a VB.Net developer then don't panic you can still use the classes without having to write a line of C# code.&lt;/p&gt; &lt;p&gt;&lt;span style="color: green; font-size: 0.8em"&gt;VB.Net developers: You need to create 2 web applications. 1 C# (Host project for Repository Factory) and 1 VB.&lt;br&gt;After you have completed all your code generation tasks all you need from the C# project is the web.config file. Copy this to the VB web application and then you can delete the C# web application. Not ideal, but workable.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Create a visual studio solution with the following 3 projects.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;User Interface Web Project (C# and VB) - Start-up Project  &lt;li&gt;Data Access Project (Must be C#)  &lt;li&gt;Business Logic Layer Project (C# or VB) &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="projectStructure" border="0" alt="projectStructure" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWFR9c65I/AAAAAAAAFxs/VsmhScqxcS8/projectStructure%5B4%5D.gif?imgmax=800" width="256" height="296"&gt; &lt;/p&gt; &lt;p&gt;Figure 2. &lt;/p&gt; &lt;h3&gt;Step 4 - Enable the Guidance Package for the solution&lt;/h3&gt; &lt;p&gt;Within Visual Studio, select Tools and then click on the Guidance Package Manager.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="guidancePackageEnable" border="0" alt="guidancePackageEnable" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWGOSeqtI/AAAAAAAAFxw/B4i3dQEBpZA/guidancePackageEnable%5B4%5D.gif?imgmax=800" width="554" height="440"&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The Following screen will pop up. Click on the Enable/Disable Packages button.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="guidancePackageManager" border="0" alt="guidancePackageManager" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWGsj6VRI/AAAAAAAAFx0/jex7UhPPE18/guidancePackageManager%5B4%5D.gif?imgmax=800" width="574" height="341"&gt; &lt;/p&gt; &lt;p&gt;From here you will be presented with packages that are installed on your machine. There may be more or less displayed depending on which packages you have downloaded. Choose the Repository Factory package.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="guidancePackageSelect" border="0" alt="guidancePackageSelect" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWHR_d3YI/AAAAAAAAFx4/Xzg_KuxbKKY/guidancePackageSelect%5B4%5D.gif?imgmax=800" width="604" height="384"&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Step 5 - How to use the Repository Factory&lt;/h3&gt; &lt;p&gt;Now that you have enabled the package there are a number of 'Recipes' to choose from. I tend to think of Recipes as glorified macros that execute and perform a series of tasks for you. The Repository package contains the following&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="packageRecipes" border="0" alt="packageRecipes" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWIM1L2VI/AAAAAAAAFx8/-ST1Xzenwhk/packageRecipes%5B4%5D.gif?imgmax=800" width="554" height="329"&gt; &lt;/p&gt; &lt;p&gt;Our workflow with this package will be:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Specify Project Responsibilities  &lt;li&gt;Add a database connection  &lt;li&gt;Create CRUD stored procedures  &lt;li&gt;Create Business Entities  &lt;li&gt;Create Data Repository Classes &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Step 6 - Specify Project Responsibilities&lt;/h3&gt; &lt;p&gt;For the package to generate our data access code and classes it needs to know into which projects will it place the final code. If you think again of a macro scenario then you are simply supplying the parameters. The package need to know :&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The Host Project&lt;/strong&gt; - This will be our web application&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The Data Access Project&lt;/strong&gt; - This will be our PowerCapacityDal class project&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The Business Entities Project&lt;/strong&gt; -&amp;nbsp; This will also be our PowerCapacityDal class project&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 0.8em"&gt;*Note: You could create a new project for your business entities but I prefer just to put them in the DAL&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Right click the &lt;strong&gt;PowerCapacityUI&lt;/strong&gt; project. You will see that a new 'Repository Factory' menu option has appeared. Select the specify project responsibility option.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="webResponsibilty" border="0" alt="webResponsibilty" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWIgD9gCI/AAAAAAAAFyA/3XfSnJzJO-A/webResponsibilty%5B4%5D.gif?imgmax=800" width="610" height="306"&gt; &lt;/p&gt; &lt;p&gt;From here, select &lt;strong&gt;Host Project&lt;/strong&gt; and click the &lt;strong&gt;Finish&lt;/strong&gt; button.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWJK9xU6I/AAAAAAAAFyE/FaRXusTXazU/s1600-h/projectResponsibility%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="projectResponsibility" border="0" alt="projectResponsibility" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWJ5NtVII/AAAAAAAAFyI/578pNoEd7ps/projectResponsibility_thumb%5B1%5D.gif?imgmax=800" width="554" height="392"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Next right click the &lt;strong&gt;PowerCapacityDal&lt;/strong&gt; project. Again, select Repository Factory and then specify the project responsibility option. This time choose both Business Entities Project AND Data Access Project. This tells the package that you want to store all the generated code into this project.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWKWaD5pI/AAAAAAAAFyM/PQZNHE847KM/s1600-h/projectResponsibilityDal%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="projectResponsibilityDal" border="0" alt="projectResponsibilityDal" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWLO6PyoI/AAAAAAAAFyQ/bc_iSAZf8xY/projectResponsibilityDal_thumb%5B1%5D.gif?imgmax=800" width="554" height="392"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Step 7 - Add a database connection&lt;/h3&gt; &lt;p&gt;We need to tell the package which database we would like to connect to. This will be stored in the web.config file of the web application. So, right click the PowerCapacityUI project and select Add database connection.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWMWrymhI/AAAAAAAAFyU/GHMJPGNztFE/s1600-h/addConnection%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="addConnection" border="0" alt="addConnection" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWNIzUISI/AAAAAAAAFyY/QlgLw1ARbgs/addConnection_thumb%5B1%5D.gif?imgmax=800" width="524" height="88"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Type in &lt;strong&gt;PowerCapacityConnection&lt;/strong&gt; in the Connection Name field. And click on the builder button (...) to the right side of the Connection String field.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWNtbKGqI/AAAAAAAAFyc/vn5ZzjB97SY/s1600-h/addConnectionPop1%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="addConnectionPop1" border="0" alt="addConnectionPop1" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWOI4UWQI/AAAAAAAAFyg/eGWPXxUW1-Q/addConnectionPop1_thumb%5B1%5D.gif?imgmax=800" width="554" height="378"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Step through the wizard to create the connection string to the database.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWO-A721I/AAAAAAAAFyk/cIO4ZCV00N8/s1600-h/addConnectionPop2%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="addConnectionPop2" border="0" alt="addConnectionPop2" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWP4BRenI/AAAAAAAAFyo/iCA525Y8jXU/addConnectionPop2_thumb%5B1%5D.gif?imgmax=800" width="554" height="387"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h3&gt;Step 8 - Create CRUD stored procedures&lt;/h3&gt; &lt;p&gt;The package will create a sql file that contains scripts to generate all the necessary stored procedures. This file can be run against the database.&lt;/p&gt; &lt;p&gt;Right click on the PowerCapacityDal project and select create CRUD stored procedures.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWQWYj7II/AAAAAAAAFys/NEBbOKJwmFE/s1600-h/crudSelect%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="crudSelect" border="0" alt="crudSelect" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWRlJE32I/AAAAAAAAFyw/0TcgiSvxkk0/crudSelect_thumb%5B1%5D.gif?imgmax=800" width="534" height="132"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This will open a wizard. Select the connection name from the drop down list.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWSM4A5BI/AAAAAAAAFy0/amMpse7Bge8/s1600-h/crudSelectWizard1%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="crudSelectWizard1" border="0" alt="crudSelectWizard1" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWS_T0lPI/AAAAAAAAFy4/C4v7969GVaw/crudSelectWizard1_thumb%5B1%5D.gif?imgmax=800" width="554" height="498"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Select all the tables that you wish to generate stored procedures for.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWTQV6J3I/AAAAAAAAFy8/SjxG04HzAXQ/s1600-h/crudSelectWizard2%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="crudSelectWizard2" border="0" alt="crudSelectWizard2" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWUEH91cI/AAAAAAAAFzA/qfQLt610_g4/crudSelectWizard2_thumb%5B1%5D.gif?imgmax=800" width="554" height="498"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The package will generate all the necessary stored procedures. Simply click next to select the default names and CRUD operations.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWUp9YzFI/AAAAAAAAFzE/NLtSPRijRI0/s1600-h/crudSelectWizard3%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="crudSelectWizard3" border="0" alt="crudSelectWizard3" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWVbmELAI/AAAAAAAAFzI/CbfTm5rEsnU/crudSelectWizard3_thumb%5B1%5D.gif?imgmax=800" width="554" height="498"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Specify a file to save the script produced.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWVybxw1I/AAAAAAAAFzM/Id8r_w1zrLU/s1600-h/crudSelectWizard4%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="crudSelectWizard4" border="0" alt="crudSelectWizard4" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWWnzBJsI/AAAAAAAAFzQ/16RwzHHGm5c/crudSelectWizard4_thumb%5B1%5D.gif?imgmax=800" width="554" height="498"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;We now have a file in the PowerCapacityDal that can be executed against our database. Use SQL Query Analyser or equivalent to execute this script. (see below for SQL 2000 users)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWXJuvTbI/AAAAAAAAFzU/44f77FVJUAo/s1600-h/crudSelectWizard5%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="crudSelectWizard5" border="0" alt="crudSelectWizard5" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWXxwa_vI/AAAAAAAAFzY/Pz3VuwEqsLg/crudSelectWizard5_thumb%5B1%5D.gif?imgmax=800" width="554" height="417"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Note for SQL 2000 Users&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The SQL generated is in SQL Server 2005 syntax. If your stuck on SQL 2000 don't panic, you can edit this file to get it to run. Remove the RethrowError SP at the top and just find and replace 2005 specific syntax.&lt;/p&gt; &lt;p&gt;Find: sys.objects &lt;br&gt;Replace: sysobjects&lt;/p&gt; &lt;p&gt;Find: BEGIN TRY &lt;br&gt;Replace: &lt;/p&gt; &lt;p&gt;Find: END TRY &lt;br&gt;Replace: &lt;/p&gt; &lt;p&gt;Find: BEGIN CATCH&lt;br&gt;Replace: &lt;/p&gt; &lt;p&gt;Find: END CATCH &lt;br&gt;Replace: &lt;/p&gt; &lt;p&gt;Find: EXEC RethrowError; &lt;br&gt;Replace: &lt;/p&gt; &lt;p&gt;At this stage you should have all your select, update, insert and delete stored procedures created on the database just by going though a few wizards. Easy or what!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWYTfYwvI/AAAAAAAAFzc/IBXCMpksH04/s1600-h/crudSelectWizard6%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="crudSelectWizard6" border="0" alt="crudSelectWizard6" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWZHuN6sI/AAAAAAAAFzg/EUg5c4aiOXs/crudSelectWizard6_thumb%5B1%5D.gif?imgmax=800" width="554" height="417"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Step 9 - Create Business Entities&lt;/h3&gt; &lt;p&gt;The next stage is to get the Repository Factory to generate our Business Entities for us. We can then use these objects within our web application to hold and manipulate the data. &lt;/p&gt; &lt;p&gt;Right click the PowerCapacityDal project and select the create business entities from database recipe.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWZmFFwoI/AAAAAAAAFzk/2w1hRxE6hPY/s1600-h/entitiesCreate%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="entitiesCreate" border="0" alt="entitiesCreate" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWaWuMWrI/AAAAAAAAFzo/YAtLMMkR6rk/entitiesCreate_thumb%5B1%5D.gif?imgmax=800" width="540" height="161"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Again, choose the connection name from the drop down list.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWbGqTtiI/AAAAAAAAFzs/YRwuyx8nygk/s1600-h/entitiesCreateWizard1%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="entitiesCreateWizard1" border="0" alt="entitiesCreateWizard1" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWbiOiHVI/AAAAAAAAFzw/n1hKU1pcm7Y/entitiesCreateWizard1_thumb%5B1%5D.gif?imgmax=800" width="554" height="464"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;From here you can customise which elements are needed within the application. I have just accepted the default to include all fields in the database. Each field is mapped to a property on the Business Entity with the relevant get and set statements created for you.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWcXHli6I/AAAAAAAAFz0/tAiUv8mWOmM/s1600-h/entitiesCreateWizard2%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="entitiesCreateWizard2" border="0" alt="entitiesCreateWizard2" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWdCWw_mI/AAAAAAAAFz4/i62rMIEBcMU/entitiesCreateWizard2_thumb%5B1%5D.gif?imgmax=800" width="554" height="464"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The final stage is to customise the objects themselves. You may want to change the names and determine if the properties should only have a get method for the given attribute (read only). I have just accepted the default of all.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWdre0KYI/AAAAAAAAFz8/RAEjcBPRba8/s1600-h/entitiesCreateWizard3%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="entitiesCreateWizard3" border="0" alt="entitiesCreateWizard3" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWeUmCXuI/AAAAAAAAF0A/R-FQuXysi6Y/entitiesCreateWizard3_thumb%5B1%5D.gif?imgmax=800" width="554" height="464"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Click on the Finish button and the Repository Factory will generate all your business entity classes. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWfDWKpFI/AAAAAAAAF0E/SddQ9TcJuUU/s1600-h/entitiesCreateFinish%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="entitiesCreateFinish" border="0" alt="entitiesCreateFinish" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWf7typaI/AAAAAAAAF0I/9k7bNLWwSFw/entitiesCreateFinish_thumb%5B1%5D.gif?imgmax=800" width="604" height="454"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You can have a look the class view to see the properties that have been exposed. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWgknZkKI/AAAAAAAAF0M/ZUnKvCSisOc/s1600-h/entitiesCreateClassView%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="entitiesCreateClassView" border="0" alt="entitiesCreateClassView" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWhb8KluI/AAAAAAAAF0Q/vuGUghxeqRY/entitiesCreateClassView_thumb%5B1%5D.gif?imgmax=800" width="253" height="408"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h3&gt;Step 10 - Create Data Repository Classes&lt;/h3&gt; &lt;p&gt;By this stage we have our Business Entities and all of our database stored procedures. The next stage is to create classes that we can use to execute commands against our database.&lt;/p&gt; &lt;p&gt;Right click the &lt;strong&gt;PowerCapacityDal&lt;/strong&gt; project and select the Create data repository classes from business entities.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWh43NbbI/AAAAAAAAF0U/X-rXtQiq07o/s1600-h/repositoryCreate%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreate" border="0" alt="repositoryCreate" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWiurIzYI/AAAAAAAAF0Y/J5NMn02KJ_k/repositoryCreate_thumb%5B1%5D.gif?imgmax=800" width="543" height="149"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This again starts a wizard to walk you through the process. First step is to choose your connection name from the dropdown list. You should be getting used to this by now ;-)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWjaqF1tI/AAAAAAAAF0c/6D9WiugV0A4/s1600-h/repositoryCreateWizard1%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard1" border="0" alt="repositoryCreateWizard1" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWkNbQ0rI/AAAAAAAAF0g/QEDWZ3ijR1g/repositoryCreateWizard1_thumb%5B1%5D.gif?imgmax=800" width="554" height="500"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Then, just confirm where the wizard can find the business entities. We chose to put them in the &lt;strong&gt;PowerCapacityDal&lt;/strong&gt; project but as mentioned before you can create a separate project for these objects.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWlRh0o5I/AAAAAAAAF0k/weQwKWKZZ60/s1600-h/repositoryCreateWizard2%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard2" border="0" alt="repositoryCreateWizard2" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWmNSDf1I/AAAAAAAAF0o/0MYfoFAChbw/repositoryCreateWizard2_thumb%5B1%5D.gif?imgmax=800" width="554" height="500"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Next, click on the objects that you want to generate repository classes for. I have clicked on them all.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWmh4kJQI/AAAAAAAAF0s/Czyu-9yq1Yg/s1600-h/repositoryCreateWizard3%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard3" border="0" alt="repositoryCreateWizard3" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWnvXvt_I/AAAAAAAAF0w/DsRsL1-2Gbw/repositoryCreateWizard3_thumb%5B1%5D.gif?imgmax=800" width="554" height="500"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Next you need to tell the Factory which operations you are interested in. By default there is a GetAll,&amp;nbsp; Insert, Update and Delete. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWpMb14RI/AAAAAAAAF00/LGxuYqPXVcI/s1600-h/repositoryCreateWizard4%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard4" border="0" alt="repositoryCreateWizard4" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzWplKWH8I/AAAAAAAAF04/CnErBLCgDrA/repositoryCreateWizard4_thumb%5B1%5D.gif?imgmax=800" width="554" height="500"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I also need a GetOne for each object e.g. Bring me back a Cabinet object based on a Cabinet Id that I pass. So click on the &lt;strong&gt;Add...&lt;/strong&gt; button and select Get One.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWqQxFXRI/AAAAAAAAF08/MNuG-5m1RYU/s1600-h/repositoryCreateWizard5%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard5" border="0" alt="repositoryCreateWizard5" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWq1q6o5I/AAAAAAAAF1A/K7-43vBJAQE/repositoryCreateWizard5_thumb%5B1%5D.gif?imgmax=800" width="554" height="497"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Next, specify which stored procedure to use to get the one that you want. For me I want to use &lt;strong&gt;GetCabinetByCabinetId&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWrm-3S6I/AAAAAAAAF1E/v4hQZz2u73I/s1600-h/repositoryCreateWizard6%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard6" border="0" alt="repositoryCreateWizard6" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWsZ1VktI/AAAAAAAAF1I/Z4rhjy_BUP0/repositoryCreateWizard6_thumb%5B1%5D.gif?imgmax=800" width="554" height="448"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Next, you need to confirm the mapping between output columns and the business object properties. This has been done for me as the field names in the database are the same as my Cabinet business entity.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWtOazDhI/AAAAAAAAF1M/_RBt0lNNdH8/s1600-h/repositoryCreateWizard7%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard7" border="0" alt="repositoryCreateWizard7" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWt_PoEzI/AAAAAAAAF1Q/RwpfghI_9cY/repositoryCreateWizard7_thumb%5B1%5D.gif?imgmax=800" width="554" height="448"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;You need to do this for each object that you require a &lt;strong&gt;GetOne&lt;/strong&gt; operation. Perhaps in future releases this behaviour will be defaulted. Now you see all the operations that will be generated. Notice the GetCabinetByCabinetId operation below.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWuRlQ1vI/AAAAAAAAF1U/HPs977z-qE8/s1600-h/repositoryCreateWizard8%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateWizard8" border="0" alt="repositoryCreateWizard8" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWu7hDKKI/AAAAAAAAF1Y/daLf09kV2NQ/repositoryCreateWizard8_thumb%5B1%5D.gif?imgmax=800" width="554" height="500"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;When you click &lt;strong&gt;Finish&lt;/strong&gt; this time the Repository Factory will go and create all the classes needed for your data access layer.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWvq2Dd3I/AAAAAAAAF1c/oxIit-3fFnI/s1600-h/repositoryCreateFinish%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryCreateFinish" border="0" alt="repositoryCreateFinish" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TFzWweL93PI/AAAAAAAAF1g/j9eHcUPwEus/repositoryCreateFinish_thumb%5B1%5D.gif?imgmax=800" width="604" height="454"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You will notice that the Repository Factory has referenced all the necessary dll's that are required. It also uses the Enterprise Library for that actual database calls so this is copied in for you. Each Business Entity get's its own folder with the necessary classes for each CRUD operation. I won't go into the detail here of the programming patterns used as you can just think of it as a black box for now.&lt;/p&gt; &lt;p&gt;So there you have it. A complete data access layer created without you having to write a single line of code. The only thing left is to use it.&lt;/p&gt; &lt;h3&gt;Step 11 - Consuming the Data Access Layer&lt;/h3&gt; &lt;p&gt;First build the solution to make sure you don't have any errors.&lt;/p&gt; &lt;p&gt;Next,&amp;nbsp; right click your &lt;strong&gt;PowerCapacityBll&lt;/strong&gt; project add a reference to the PowerCapacityDal project.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="addReference" border="0" alt="addReference" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWxQ9sLII/AAAAAAAAF18/QqOXAMEf66Y/addReference%5B5%5D.gif?imgmax=800" width="471" height="386"&gt; &lt;/p&gt; &lt;p&gt;Next, Add a reference to the Repository dll. This should be in the following folder:&lt;/p&gt; &lt;p&gt;C:\Program Files\Microsoft Patterns &amp;amp; Practices\Data Access Guidance Package Setup\&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repositoryReference" border="0" alt="repositoryReference" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzWyv8j9GI/AAAAAAAAF2A/upeOslbp7WI/repositoryReference%5B4%5D.gif?imgmax=800" width="471" height="386"&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Next, in your &lt;strong&gt;PowerCapacityBll&lt;/strong&gt; project add a new class called &lt;strong&gt;CabinetManager&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="cabinetMangerCreate" border="0" alt="cabinetMangerCreate" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWzvWla_I/AAAAAAAAF2I/eQpykVEt86k/cabinetMangerCreate%5B4%5D.gif?imgmax=800" width="554" height="342"&gt; &lt;/p&gt; &lt;p&gt;Add the following code to get a list of cabinet objects from the database and save a cabinet object back to the database. &lt;/p&gt; &lt;div style="width: 600px; overflow: auto" class="codebox"&gt;&lt;!--&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;--&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; PowerCapacityDal;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; Microsoft.Practices.Repository;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; PowerCapacityBll&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; CabinetManager&lt;br /&gt;    { &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Get all cabinet objects&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;A generic list of cabinet objects&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Cabinet&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; GetAll()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; The Repository creates the proper object based on the interface provided&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; This mapping is held in the web.config file&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            ICabinetRepository cabinetRepository &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; RepositoryFactory.Create&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ICabinetRepository&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;("PowerCapacityConnection");&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; In real life you may want to check the identity of the caller or perform&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; other operations prior to returning the list&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; cabinetRepository.GetAllFromCabinet();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Save a cabinet object to the database&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param name="cabinet"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;the cabinet object to save&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; Save(Cabinet cabinet)&lt;br /&gt;        {&lt;br /&gt;            ICabinetRepository cabinetRepository &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; RepositoryFactory.Create&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ICabinetRepository&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;("PowerCapacityConnection");&lt;br /&gt;            cabinetRepository.Save(cabinet);&lt;br /&gt;        }&lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;            &lt;br /&gt;            &lt;br /&gt;            &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The Repository Factory 'works out' which class to create based on mapping information held in the web.config. You don't have to worry about this as the Repository Factory deals with it. I show this below for information only.&lt;/p&gt;&lt;br /&gt;&lt;div style="width: 600px; overflow: auto" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;--&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;repositoryFactory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;repositories&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000"&gt;interfaceType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.ICabinetRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; repositoryType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.CabinetRepositoryArtifacts.CabinetRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000"&gt;interfaceType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.ICustomerRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; repositoryType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.CustomerRepositoryArtifacts.CustomerRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000"&gt;interfaceType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.IFloorRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; repositoryType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.FloorRepositoryArtifacts.FloorRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000"&gt;interfaceType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.ILocationRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; repositoryType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.LocationRepositoryArtifacts.LocationRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000"&gt;interfaceType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.IPowerSourceRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; repositoryType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.PowerSourceRepositoryArtifacts.PowerSourceRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000"&gt;interfaceType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.IRackRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; repositoryType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="PowerCapacityDal.RackRepositoryArtifacts.RackRepository, PowerCapacityDal"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;repositories&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;repositoryFactory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;This is how you can construct your Business Layer. Now that you see how easy it is to call your Data Access methods all we need to do is link up the user interface.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Step 12 - Implement the User Interface&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;By this stage we have a fully functioning data access layer created entirely without writing a single line of code. We have added a business logic layer that wraps over this allowing you to implement any business rules that are required.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Next, we will create a web page with a GridView control that will bind to a method in the &lt;strong&gt;PowerCapacityBll&lt;/strong&gt; that will in turn call a data access layer method in our &lt;strong&gt;PowerCapacityDal&lt;/strong&gt; project. A nice n-tier design.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Right click the PowerCapacityUI web project and add a reference to the &lt;strong&gt;PowerCapacityBll&lt;/strong&gt; project so we can call its methods.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In the code behind page of the &lt;strong&gt;default.aspx&lt;/strong&gt; page add the following code to the page load event.&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;!--&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;--&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; Page_Load(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;IsPostBack)&lt;br /&gt;    {&lt;br /&gt;        GridView1.DataSource &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; PowerCapacityBll.CabinetManager.GetAll();&lt;br /&gt;        GridView1.DataBind();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;And thats it. What's more, it's up to you to decide how much you want from the Repository Factory package. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Hopefully this article will encourage you to download and use the Repository Factory package. This package is still work in progress so I'm sure the team would welcome any feedback you have on it but already it provides many benefits.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As you have seen, it's possible to have Visual Studio generate all of your data access code using this package. Think how much time you can save and how little 'grunt' coding you are required to write. At a bare minimum you can use this to generate all of your database stored procedures. You can make the choice whether you want to implement the business entity objects and data access code yourself or extend and modify the code that is generated.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Further Reading&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Dave Hayden has a number of good blog entries and screencasts on the Repository Factory. You can find more details at the following links:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://davidhayden.com/blog/dave/category/64.aspx" target="_blank"&gt;David Hayden - Repository Factory Blog&lt;/a&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.pnpguidance.net/Category/RepositoryFactory.aspx" target="_blank"&gt;David Hayden - Patterns And Practices Guidance&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-3273199191532043859?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/3273199191532043859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2010/08/create-data-access-layer-dal-without.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/3273199191532043859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/3273199191532043859'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2010/08/create-data-access-layer-dal-without.html' title='Create A Data Access Layer (DAL) without writing any code'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzWEYn6vEI/AAAAAAAAFxk/1Dlhl-mF2a8/s72-c/schema%5B4%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-1219875357013870484</id><published>2006-10-12T12:55:00.000+10:00</published><updated>2010-08-07T13:01:47.649+10:00</updated><title type='text'>Query Active Directory using Atlas (AJAX)</title><content type='html'>&lt;p&gt;Last updated : 12th October 2006&lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;There is a lot of buzz around about AJAX and Microsoft's 'wrapper' technology referred to as Atlas. This is still in development but it's stable enough to use, certainly in my environment. This tutorial uses the CTP edition of the Ajax Library.&lt;/p&gt; &lt;p&gt;We will build a tool that allows users to find individuals on an Active Directory(AD) and then retrieve additional information from their AD Entry&lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;To make this as slick as possible we will Atlas enable the solution. What we want is for the user to start typing the individuals name and the application should then retrieve/filter and suggest valid entries as they type. When they locate the correct entry they will then click a button to retrieve the required information about the user back from Active Directory. This should update a section of the page without a full postback. &lt;/p&gt; &lt;p&gt;The first thing you need is to have the Atlas libraries installed. You can download the installation files from &lt;a href="http://atlas.asp.net" target="_blank"&gt;http://atlas.asp.net&lt;/a&gt;. After installation you will have a new project template as shown below. This adds the Microsoft.Web.Atlas.dll and relevant web.config entries that are necessary to 'bridge' out to the web service. &lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="AD_AtlasProject" border="0" alt="AD_AtlasProject" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzLQtZfUmI/AAAAAAAAFxU/LlHDPXmky2Y/AD_AtlasProject%5B8%5D.gif?imgmax=800" width="504" height="335"&gt; &lt;/p&gt; &lt;p&gt;I've had a few emails requesting C# instead of VB.Net, so this tutorial is in C# but you can download a VB version as well. In order to achieve this AJAX functionality we will use 2 server controls from the Atlas library - UpdatePanel and the AutoCompleteExtender. See below. &lt;/p&gt; &lt;p&gt;&lt;b&gt;Atlas Toolbar in VS 2005&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="AD_AtlasToolbar" border="0" alt="AD_AtlasToolbar" src="http://lh5.ggpht.com/_BYGp_3Y5xXE/TFzLRJpcVyI/AAAAAAAAFxY/dxXyZYuYlDg/AD_AtlasToolbar%5B4%5D.gif?imgmax=800" width="210" height="450"&gt; &lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;Lets have a look at what the final result will look like. I have kept the styling and error handling to a minimum for clarity.&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="AD_populatedrodown" border="0" alt="AD_populatedrodown" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzLR7tsfVI/AAAAAAAAFxc/61Ao4_TthrE/AD_populatedrodown%5B4%5D.gif?imgmax=800" width="504" height="379"&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;To achieve this we require a single web page and a web service with a single method call.&lt;/p&gt; &lt;h3&gt;Web Service&lt;/h3&gt; &lt;div style="width: 600px; overflow: auto" class="codebox"&gt; &lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;@ WebService Language&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;C#&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; Class&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADValidate&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.Services;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.Services.Protocols;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.DirectoryServices;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Configuration;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;[WebService(Namespace &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://tempuri.org/&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)]&lt;br /&gt;[WebServiceBinding(ConformsTo &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; WsiProfiles.BasicProfile1_1)]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; ADValidate  : System.Web.Services.WebService {&lt;br /&gt;&lt;br /&gt;    [WebMethod]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[] GetUserNames(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; prefixText, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; count)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Entry to LDAP objects e.g. LDAP:&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;name.server.com/OU=UsersOU=Managed Objects,DC=server,DC=com&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        DirectoryEntry de &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; DirectoryEntry(ConfigurationManager.AppSettings.Get(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADPath&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;));&lt;br /&gt;&lt;br /&gt;        de.Username &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ConfigurationManager.AppSettings.Get(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADServiceAccount&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        de.Password &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ConfigurationManager.AppSettings.Get(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADServiceAccountPassword&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        de.AuthenticationType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; AuthenticationTypes.FastBind;&lt;br /&gt;&lt;br /&gt;        DirectorySearcher ds &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; DirectorySearcher(de);&lt;br /&gt;        ds.ClientTimeout &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; TimeSpan.FromSeconds(&lt;/span&gt;&lt;span style="color: #800080"&gt;30&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        ds.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;displayName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;        ds.SizeLimit &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;100&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        SortOption srt;&lt;br /&gt;        srt &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; SortOption(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;displayName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, SortDirection.Ascending);&lt;br /&gt;        ds.Sort &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; srt;&lt;br /&gt;        ds.Filter &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;(displayName=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; prefixText.Trim() &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;*)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;        SearchResultCollection src;&lt;br /&gt;        src &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ds.FindAll();&lt;br /&gt;&lt;br /&gt;        List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; CandidateList &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (SearchResult sr &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; src)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; Candidate &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; sr.Properties[&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;displayName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;])&lt;br /&gt;            {&lt;br /&gt;                CandidateList.Add(Candidate);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; CandidateList.ToArray();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The web service accepts 2 parameters (prefixText and count). The web service is responsible for returning an Array of strings back to the JavaScript calling function and this is used to populate the filtered list of matching users. Although the calling mechanism is JavaScript there is no client side coding required as the Atlas server controls take care of the necessary JavaScript that is emitted based on the web client (IE, Firefox etc).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Inside the web service we basically create a searcher object that will query the Active Directory using the System.DirectoryServices namespace (Remember to add it into your solution as a reference). Note the asterisk (*) at the end of the filter, this acts like a wild card. We also make sure that the list comes back sorted. We are only interested in returning the 'displayName' entry in the Active Directory structure so this is the only property we load prior to execting the FindAll() call. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;After the call I am simply looping through the results and adding them to a generic collection of strings or simply returning an empty string array if no entries match.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;UI - Web Page&lt;/h3&gt;&lt;br /&gt;&lt;div style="width: 600px; overflow: auto" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;@ Page Language&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;C#&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;@ Import Namespace&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;System.DirectoryServices&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;@ Import Namespace&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;System.Configuration&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;@ Import Namespace&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;System.Data&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;DOCTYPE html PUBLIC &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;-//W3C//DTD XHTML 1.0  Transitional//EN&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;html xmlns&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;http://www.w3.org/1999/xhtml&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;head id&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Head1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;title&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;title&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;style type&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;text/css&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;     body { &lt;br /&gt;        font&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;family: Arial, Verdana;&lt;br /&gt;        font&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;size: 11pt;&lt;br /&gt;        font&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;color: #&lt;/span&gt;&lt;span style="color: #800080"&gt;000000&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        margin: &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        padding: &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; 10px &lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; 10px;&lt;br /&gt;        text&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;align: left &lt;br /&gt;        }&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;style&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;atlas:ScriptManager ID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;AtlasScriptCore&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; EnablePartialRendering&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;true&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;head&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;body&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;form id&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Form1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;div id&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;content&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;h3&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                Active Directory Searcher&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;h3&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;div id&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;searchbox&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                Type Users Surname&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;br &lt;/span&gt;&lt;span style="color: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;asp:TextBox ID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;txtFullName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;asp:Button ID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;btnDetails&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; Text&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Get AD Details&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; OnClick&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;GetADDetails&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;atlas:AutoCompleteExtender runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; ID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;autoComplete1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;atlas:AutoCompleteProperties &lt;br /&gt;                            TargetControlID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;txtFullName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;                            Enabled&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;True&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;                            ServicePath&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADValidate.asmx&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                            ServiceMethod&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;GetUserNames&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;                            MinimumPrefixLength&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;atlas:AutoCompleteExtender&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;div&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;br &lt;/span&gt;&lt;span style="color: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;div id&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Results&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;atlas:UpdatePanel ID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdatePanel1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; Mode&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Conditional&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;asp:GridView ID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADUserProperties&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;asp:GridView&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;asp:Literal runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; ID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;SysMessage&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; EnableViewState&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;false&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;asp:Literal&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Triggers&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;atlas:ControlEventTrigger ControlID&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;btnDetails&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; EventName&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Click&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;Triggers&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;atlas:UpdatePanel&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;div&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;div&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;form&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;body&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;html&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;script runat&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;server&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; GetADDetails(Object sender , EventArgs e )&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Take the value from the input box and pull back a few AD details&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        DataTable UserProperties  &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        UserProperties &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetUserByDisplayName(txtFullName.Text);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Display data if we have any or show warning&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (UserProperties &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;        {&lt;br /&gt;            ADUserProperties.DataSource &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; UserProperties;&lt;br /&gt;            ADUserProperties.DataBind();&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Show no records&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;           SysMessage.Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;p style=\"color: red;\"&amp;gt;Could not find any details for this user. &amp;lt;br /&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                                  &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Please check that the users name is correct.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt; DataTable GetUserByDisplayName(String fullUserName)&lt;br /&gt;    {&lt;br /&gt;        DirectoryEntry de &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; DirectoryEntry(ConfigurationManager.AppSettings.Get(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADPath&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;));&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Authentication details&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        de.Username &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ConfigurationManager.AppSettings.Get(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADServiceAccount&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;); &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;DOMAIN\User&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        de.Password &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ConfigurationManager.AppSettings.Get(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ADServiceAccountPassword&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        de.AuthenticationType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; AuthenticationTypes.FastBind;&lt;br /&gt;&lt;br /&gt;        DirectorySearcher DirectorySearcher &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; DirectorySearcher(de);&lt;br /&gt;        DirectorySearcher.ClientTimeout &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; TimeSpan.FromSeconds(&lt;/span&gt;&lt;span style="color: #800080"&gt;30&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; load the properties we are interested in&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;cn&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;sAMAccountName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mail&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;displayName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;mDBStorageQuota&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;physicalDeliveryOfficeName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        DirectorySearcher.PropertiesToLoad.Add(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;telephoneNumber&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; filter it on exact entry - NOTE no wild card&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        DirectorySearcher.Filter &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;(displayName=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; fullUserName.Trim() &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;        SearchResult result;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; There should only be one entry&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        result &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DirectorySearcher.FindOne();&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (result &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt; Create a table an populate it with properties to bind to gridview&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            DataTable myTable &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; DataTable(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ActiveDir&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;            myTable.Columns.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; DataColumn(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Key&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, System.Type.GetType(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;System.String&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)));&lt;br /&gt;            myTable.Columns.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; DataColumn(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Value&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, System.Type.GetType(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;System.String&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)));&lt;br /&gt;            DataRow myRow;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; propname &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; result.Properties.PropertyNames)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (Object objValue &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; result.Properties[propname])&lt;br /&gt;                {&lt;br /&gt;                    myRow &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; myTable.NewRow();&lt;br /&gt;                    myRow[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; propname;&lt;br /&gt;                    myRow[&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; objValue.ToString();&lt;br /&gt;                    myTable.Rows.Add(myRow);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; myTable;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;script&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Note the entries for the Atlas controls. I'm only setting properties, there is no need to write any Javascript as the Atlas framework is responsible for this. The UpdatePanel is updated when we click on the 'Get AD Details' button. You can see that I have set this in the &amp;lt;Triggers&amp;gt; section of the Update Panel.&amp;nbsp; Also note that I set a property on the script manger to enable partial page rendering - EnablePartialRendering&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;true&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color: #800000"&gt;&lt;/span&gt;For the AutoCompleteExtender, I tell the control where to go for the data (web service and method name), how many characters need to be typed before making the web service call and which control on the page is looking for the data. This is all done in a declarative fashion. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;When the user selects a entry form the dropdown list and clicks on the 'Get AD Details' button we then execute another search on the Active directory but this time we are searching for only one entry. We use the .FindOne() method to bring back the reequired information, hence the additional PropertiesToLoad entries. Once we get these back I am simply creating a DataTable to return back for binding to a GridView in the standard fashion. See below.&amp;nbsp; &lt;/p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="AD_SearchComplete" border="0" alt="AD_SearchComplete" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TFzLSk8RnLI/AAAAAAAAFxg/83lfVQuasGA/AD_SearchComplete%5B4%5D.gif?imgmax=800" width="504" height="379"&gt; &lt;br /&gt;&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Hopefully this tutorial has shown how you might query an Active Directory structure and how easy it then is to add AJAX functionality with Atlas Server controls. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you download the samples remember to change the AppSettings section in the web.config file to match entries in your environment.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-1219875357013870484?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/1219875357013870484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2006/10/query-active-directory-using-atlas-ajax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/1219875357013870484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/1219875357013870484'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2006/10/query-active-directory-using-atlas-ajax.html' title='Query Active Directory using Atlas (AJAX)'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_BYGp_3Y5xXE/TFzLQtZfUmI/AAAAAAAAFxU/LlHDPXmky2Y/s72-c/AD_AtlasProject%5B8%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-2872835222814496531</id><published>2006-09-13T15:32:00.000+10:00</published><updated>2010-08-15T15:33:29.071+10:00</updated><title type='text'>SQL Transactions</title><content type='html'>&lt;p&gt;Last updated : 13th September 2006&lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;In many applications there is a need to be able to insert data across multiple tables as an atomic unit of work. In this example I will cover a simple page in a shopping cart application that requires users to provide both a billing and a shipping address. This information is stored across two separate tables (User and Address) as a parent-child relationship. There would be little point in creating a new user in our database if no address details were added. The Billing dept would not know where to send the invoice and the Shipping department would not know where to deliver the goods. &lt;/p&gt; &lt;p&gt;Therefore we require that the new customer page will only succeed if:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;User details are inserted into the User table  &lt;li&gt;Billing address is inserted into the Address table with the new customer ID  &lt;li&gt;Shipping address is inserted into the Address table with the new customer ID&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;To achieve this we need to wrap all this work together as a transaction. If all parts succeed we then commit this to the database otherwise everything needs to be rolled back so that the database is in the same state that it was in prior to the insert.&lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;To implement this functionality as an ATOMIC transaction we will use the SQLTransaction class of the System.Data.SQLClient namespace. Just so you are aware, there are other ways to implement transactions, notably TSQL in stored procedures and the System.Transactions namespace that is in the new version of the DOT.NET framework. &lt;/p&gt; &lt;p&gt;I like System.Transactions coding but this does not work well with the SQL 2000 databases that I use. This is because it enlists the support of the MSDTC and this adds to the overhead. However it was designed to work well with SQL Server 2005 using promotable transactions. &lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;We will assume that a user has filled their shopping basket and the next stage for new users is to register themselves and their billing and shipping information. Again this is an all or nothing insert. &lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TGd8I-W8aiI/AAAAAAAAF5k/wKQF8ga8_B4/s1600-h/frm_highlight01%5B2%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="frm_highlight01" border="0" alt="frm_highlight01" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TGd8JzB42ZI/AAAAAAAAF5o/EjgDkuz5PDM/frm_highlight01_thumb.gif?imgmax=800" width="164" height="244"&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;h3&gt;Step 1 - Architecture&lt;/h3&gt; &lt;p&gt;We will create a User and Address class to hold the information that we collect from the web form. As we will be holding multiple addresses. We will use a Generic List collection to hold these. &lt;/p&gt; &lt;div class="codebox"&gt; &lt;h3&gt;User Class&lt;/h3&gt; &lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Articles.TransactionExample&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt; User&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _forename &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _surname &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _email &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' Initializes a new instance of the User class.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="forename"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="surname"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="email"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; forename &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; surname &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; email &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            _forename &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; forename&lt;br /&gt;            _surname &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; surname&lt;br /&gt;            _email &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; email&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' Initializes a new instance of the User class.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; Forename() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _forename&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _forename &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _forename &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; Surname() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _surname&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _surname &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _surname &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; Email() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _email&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _email &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _email &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Namespace&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;h3&gt;Address Class&lt;/h3&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Articles.TransactionExample&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt; Address&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Const&lt;/span&gt;&lt;span style="color: #000000"&gt; AT_BILL &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;BILLADDRESS&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Const&lt;/span&gt;&lt;span style="color: #000000"&gt; AT_SHIP &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;SHIPADDRESS&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _userID &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _address1 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _address2 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _address3 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _city &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _postZipCode &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; _addressType &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' Initializes a new instance of the Address class.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="userID"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="address1"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="address2"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="address3"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="city"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="postZipCode"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="addressType"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; userID &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; address1 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; address2 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; address3 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; city &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; postZipCode &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; addressType &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            _userID &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; userID&lt;br /&gt;            _address1 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; address1&lt;br /&gt;            _address2 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; address2&lt;br /&gt;            _address3 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; address3&lt;br /&gt;            _city &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; city&lt;br /&gt;            _postZipCode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; postZipCode&lt;br /&gt;            _addressType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; AddressType&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' Initializes a new instance of the Address class.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="address1"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="address2"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="address3"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="city"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;param name="postZipCode"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; address1 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; address2 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; address3 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; city &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; postZipCode &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            _address1 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; address1&lt;br /&gt;            _address2 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; address2&lt;br /&gt;            _address3 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; address3&lt;br /&gt;            _city &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; city&lt;br /&gt;            _postZipCode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; postZipCode&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' Initializes a new instance of the Address class.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;'' &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; userID() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _userID&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _userID &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _userID &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; Address1() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _address1&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _address1 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _address1 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; Address2() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _address2&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _address2 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _address2 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; Address3() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _address3&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _address3 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _address3 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; City() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _city&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _city &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _city &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; PostZipCode() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _postZipCode&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _postZipCode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _postZipCode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;&lt;span style="color: #000000"&gt; AddressType() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; _addressType&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; _addressType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                _addressType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Namespace&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Step 2 - Data Access Code&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;There is a static class UserManager that we will use to perform the necessary database inserts. The methods in this class will work on the User and Address objects mentioned above. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;In the UserManager class we have the shared methods to handle the database insert logic and the transactional part. We have a method called InsertUserAndAddresses that controls the SQL Transaction.&amp;nbsp; This method takes a populated User object and a &lt;strong&gt;Generic List of&lt;/strong&gt; Address objects.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For the InsertUser and InsertAddress functions to participate in our transaction we need to pass a reference to the SQLConnection and the SQLTransaction that we created in our controlling function InsertUserAndAddresses. These are then attached to the actual SQLCommand objects that perform the inserts.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We wrap this functionality in a try/catch block so that we can easily &lt;strong&gt;rollback&lt;/strong&gt; the transaction if any errors occur. If all the inserts are successful we then &lt;strong&gt;commit&lt;/strong&gt; the transaction and it is saved in the database.&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;h3&gt;Static Data Access Class&lt;/h3&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Imports&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Articles&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Imports&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Collections.Generic&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Imports&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Data.SqlClient&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Articles.TransactionExample&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NotInheritable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt; UserManager&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;static class&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;not to be instantiated&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; NewConn() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection(ConfigurationManager.ConnectionStrings(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Articles&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ConnectionString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; InsertUserAndAddresses(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; newUser &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.User, _&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; newAddress &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; List(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Of&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.Address))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; userID &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; Tran &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlTransaction&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; conn &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; NewConn()&lt;br /&gt;                conn.Open()&lt;br /&gt;                Tran &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; conn.BeginTransaction&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Try to add the user &lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                    userID &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; InsertUser(newUser, Tran, conn)&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; AddressCount &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;To&lt;/span&gt;&lt;span style="color: #000000"&gt; newAddress.Count &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                        newAddress(i).userID &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; userID&lt;br /&gt;                        InsertAddress(newAddress(i), Tran, conn)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    Tran.Commit()&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;&lt;span style="color: #000000"&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Exception&lt;br /&gt;                    Tran.Rollback()&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; re-throw back to the ui&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt;&lt;span style="color: #000000"&gt; ex&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;           &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; InsertUser(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; newUser &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.User, _&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlTran &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlTransaction, _&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlConn &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; UserID &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; Sql &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            Sql &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;INSERT INTO [User] (&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;[Forename],[Surname],[Email]) &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;VALUES(@Forename,@Surname,@Email);SELECT SCOPE_IDENTITY();&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; cmd &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlCommand&lt;br /&gt;                cmd.Connection &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlConn&lt;br /&gt;                cmd.Transaction &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlTran&lt;br /&gt;                cmd.CommandType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Data.CommandType.Text&lt;br /&gt;                cmd.CommandText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Sql&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Forename&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newUser.Forename))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Surname&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newUser.Surname))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Email&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newUser.Email))&lt;br /&gt;                userID &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; cmd.ExecuteScalar&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; userID &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; Convert.ToInt32(userID)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; InsertAddress(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; newAddress &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.Address, _&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlTran &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlTransaction, _&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlConn &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection)&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; Sql &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            Sql &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;INSERT INTO [Address] (&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;[UserID],[Address1],[Address2],[Address3],[City],[PostZipCode],[AddressType]) &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;VALUES(@UserID,@Address1,@Address2,@Address3,@City,@PostZipCode,@AddressType)&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; cmd &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlCommand&lt;br /&gt;                cmd.Connection &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlConn&lt;br /&gt;                cmd.Transaction &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; sqlTran&lt;br /&gt;                cmd.CommandType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Data.CommandType.Text&lt;br /&gt;                cmd.CommandText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Sql&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;UserID&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newAddress.userID))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Address1&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newAddress.Address1))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Address2&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newAddress.Address2))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Address3&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newAddress.Address3))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;City&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newAddress.City))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;PostZipCode&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newAddress.PostZipCode))&lt;br /&gt;                cmd.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;AddressType&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, newAddress.AddressType))&lt;br /&gt;                cmd.ExecuteNonQuery()&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Namespace&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Step 3 - User Interface&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;When the user populates the form fields and hits submit we create a User object and a List of Address Objects. We then call the transactional method InsertuserAndAddresses. If successful, we would move onto the next stage in the checkout process. Otherwise we display an error message back to the user.&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;h3&gt;Submit Code&lt;/h3&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; btnSubmit_Click(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.EventArgs) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; btnSubmit.Click&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; you would want to validate prior to inserting&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; we assume all necessary fields are complete&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; NewUser &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.User&lt;br /&gt;&lt;br /&gt;        NewUser.Forename &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtForename.Text.Trim&lt;br /&gt;        NewUser.surname &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtSurname.Text.Trim&lt;br /&gt;        NewUser.Email &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtEmail.Text.Trim&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; NewAddress &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; Generic.List(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Of&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.Address)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; tmpAddress &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.Address&lt;br /&gt;        tmpAddress &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.Address&lt;br /&gt;        tmpAddress.Address1 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillAddress1.Text.Trim&lt;br /&gt;        tmpAddress.Address2 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillAddress2.Text.Trim&lt;br /&gt;        tmpAddress.Address3 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillAddress3.Text.Trim&lt;br /&gt;        tmpAddress.City &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillCity.Text.Trim&lt;br /&gt;        tmpAddress.PostZipCode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillZip.Text.Trim&lt;br /&gt;        tmpAddress.AddressType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Articles.TransactionExample.Address.AT_BILL&lt;br /&gt;        NewAddress.Add(tmpAddress)&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; check to see if we need to use the same address for shipping&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.chkUseBilling.Checked &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            tmpAddress &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.Address&lt;br /&gt;            tmpAddress.Address1 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillAddress1.Text.Trim&lt;br /&gt;            tmpAddress.Address2 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillAddress2.Text.Trim&lt;br /&gt;            tmpAddress.Address3 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillAddress3.Text.Trim&lt;br /&gt;            tmpAddress.City &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillCity.Text.Trim&lt;br /&gt;            tmpAddress.PostZipCode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtBillZip.Text.Trim&lt;br /&gt;            tmpAddress.AddressType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Articles.TransactionExample.Address.AT_SHIP&lt;br /&gt;            NewAddress.Add(tmpAddress)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            tmpAddress &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionExample.Address&lt;br /&gt;            tmpAddress.Address1 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtShipAddress1.Text.Trim&lt;br /&gt;            tmpAddress.Address2 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtShipAddress2.Text.Trim&lt;br /&gt;            tmpAddress.Address3 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtShipAddress3.Text.Trim&lt;br /&gt;            tmpAddress.City &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtShipCity.Text.Trim&lt;br /&gt;            tmpAddress.PostZipCode &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtShipZip.Text.Trim&lt;br /&gt;            tmpAddress.AddressType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Bracora.Articles.TransactionExample.Address.AT_SHIP&lt;br /&gt;            NewAddress.Add(tmpAddress)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            TransactionExample.UserManager.InsertUserAndAddresses(NewUser, NewAddress)&lt;br /&gt;            ClearFields(Page.Form)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;&lt;span style="color: #000000"&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Exception&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; display errr in UI&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.litError.Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;div class=""error""&amp;gt;There was a problem with the update. &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;If this persists then please contact the administrator.&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; ex.Message &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;If you wish to test the rollback of the transaction simply change the SQL statement within the InsertAddress function. This will then fail and the successful User Insert will be rolled back.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;There are many occasions where you will need to handle workflow as a transactional piece of work against a database. Hopefully this article has given you a feel for how you can perform such a task using the SQLTransaction object. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-2872835222814496531?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/2872835222814496531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2006/09/sql-transactions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/2872835222814496531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/2872835222814496531'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2006/09/sql-transactions.html' title='SQL Transactions'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_BYGp_3Y5xXE/TGd8JzB42ZI/AAAAAAAAF5o/EjgDkuz5PDM/s72-c/frm_highlight01_thumb.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-802713994262762220</id><published>2006-09-11T16:55:00.000+10:00</published><updated>2010-08-15T16:56:11.908+10:00</updated><title type='text'>Friendly Form Field Highlighting</title><content type='html'>&lt;p&gt;Last updated : 11th September 2006&lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;You have a form based input screen that users must navigate. The problem is that there are a number fields on display and the user is getting lost when they move there eyes away from the screen. Especially true if users are not good typists.&lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;We will change the background colour of the currently selected form field. This will stand out from the other fields and make it easy for our user to find it on the screen. &lt;/p&gt; &lt;p&gt;We will handle the focus and blur events using client side JavaScript to dynamically change the CSS class of the control and thus change the background colour. &lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;First, let's see how the final result should look. Notice how the currently selected field is differently coloured to the rest of the form fields. &lt;/p&gt;  &lt;h3&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="frm_highlight01" border="0" alt="frm_highlight01" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TGePisr0LdI/AAAAAAAAF6o/ifcPq-LEPGY/frm_highlight01%5B2%5D.gif?imgmax=800" width="389" height="580"&gt; &lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Step 1 - Add the CSS&lt;/h3&gt; &lt;p&gt;We will start of by adding two simple CSS classes. One that can be applied to the form field when the user enters it and another to reset it back to its default display when the user exits the field. &lt;/p&gt; &lt;div class="codebox"&gt; &lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #800000"&gt;.normalfld &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;    background-color&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff"&gt; #FFFFFF&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;br /&gt;.focusfld &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;    background-color&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff"&gt; #FFFFCC&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Step 2 - Add the JavaScript&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;We need to use client side code to change the CSS class assigned to the form field. There are a number of ways to add this in ASP.NET projects. One practice, which I'm not a great fan of, is to use the ClientScriptManager classes. For this example I will create a simple JavaScript file and attach it to the page using standard HTML &lt;span style="color: #990033"&gt;&amp;lt;script&amp;gt;&lt;/span&gt; notation. &lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; DoBlur(fld) {&lt;br /&gt;    fld.className&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;'normalfld';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; DoFocus(fld) {&lt;br /&gt;    fld.className &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; 'focusfld';&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Step 3 - Plumbing the JavaScript&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;We will add the plumbing to the ASP.NET form controls in the Page_Load event of the page. We loop through all the controls on the form and add the necessary events to our target fields. In this case we are searching for only textboxes. &lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; Page_Load(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.EventArgs) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.Load&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Not&lt;/span&gt;&lt;span style="color: #000000"&gt; Page.IsPostBack &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            SetHighlightFields(Page.Form)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.txtForename.Focus()&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; SetHighlightFields(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; frm &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Control)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; TempCheckbox &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; CheckBox &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; TempTextBox &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; TextBox &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Each&lt;/span&gt;&lt;span style="color: #000000"&gt; tmpctl &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Control &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; frm.Controls&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;TypeOf&lt;/span&gt;&lt;span style="color: #000000"&gt; tmpctl &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Is&lt;/span&gt;&lt;span style="color: #000000"&gt; TextBox &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                TempTextBox &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;CType&lt;/span&gt;&lt;span style="color: #000000"&gt;(tmpctl, TextBox)&lt;br /&gt;                TempTextBox.Attributes.Add(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;onFocus&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DoFocus(this);&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                TempTextBox.Attributes.Add(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;onBlur&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DoBlur(this);&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; ClearFields(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; frm &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Control)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Each&lt;/span&gt;&lt;span style="color: #000000"&gt; tmpctl &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Control &lt;/span&gt;&lt;span style="color: #0000ff"&gt;In&lt;/span&gt;&lt;span style="color: #000000"&gt; frm.Controls&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;TypeOf&lt;/span&gt;&lt;span style="color: #000000"&gt; tmpctl &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Is&lt;/span&gt;&lt;span style="color: #000000"&gt; TextBox &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;CType&lt;/span&gt;&lt;span style="color: #000000"&gt;(tmpctl, TextBox).Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;""&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;That's all there is to it. Now when the user tabs or clicks through in your form each field will be highlighted when it receives the focus. &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;This has hopefully given you a few ideas of your own on how to provide some 'value add' features to your web applications. As you can see from the code, or lack of it, it's easy to implement this functionality. When developing, try to imagine your application from the users perspective who is going to be using it 8 hours a day!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-802713994262762220?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/802713994262762220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2006/09/friendly-form-field-highlighting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/802713994262762220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/802713994262762220'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2006/09/friendly-form-field-highlighting.html' title='Friendly Form Field Highlighting'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_BYGp_3Y5xXE/TGePisr0LdI/AAAAAAAAF6o/ifcPq-LEPGY/s72-c/frm_highlight01%5B2%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-4379692822382629913</id><published>2006-09-02T16:42:00.000+10:00</published><updated>2010-08-15T16:43:15.187+10:00</updated><title type='text'>Friendly GridView Deletion Messages</title><content type='html'>&lt;p&gt;Last updated : 2nd September 2006&lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;You know the scenario. You present a whole load of tabular data to users in a GridView. You may have reduced the font-size so you can cram in an extra couple of rows from the database. You have an Edit and Delete LinkButtons there. So you think well I'll put in a piece of client script to make sure my users get a confirmation pop-up when they are about to delete a record. I'll code the nice OnClientClick event on the LinkButton and put in a 'Are you sure you wish to delete the record' message.&lt;/p&gt; &lt;p&gt;But wait a minute - my users are not that accurate with the mouse - I'm not that accurate with the mouse. And that font is quite small. How do I make 100% sure that they know exactly what record will be deleted? &lt;/p&gt; &lt;p&gt;Well I'll show you how to include some personal information in your pop-up message so there's no mistakes.&lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;We need to add a Delete LinkButton into a template field in the GridView. When the GridViews RowDataBound event fires for each row we want to set the onClientClick property of the LinkButton with a personalised message&lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;We have a users table that is bound to an ObjectDataSource which in turn is bound onto a GridView control. The GridView code is shown below. &lt;/p&gt; &lt;div class="codebox"&gt; &lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:GridView &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="GvUsers"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; DataKeyNames&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; AutoGenerateColumns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;     AutoGenerateEditButton&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; DataSourceID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ObjectDataSource1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Columns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TemplateField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ShowHeader&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:LinkButton &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DeleteUser"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; CausesValidation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; CommandName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Delete"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;           Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Delete"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:LinkButton&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TemplateField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; ReadOnly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="True"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Hiredate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Hiredate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Hiredate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Columns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:GridView&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;If you look at the GridView properties you will see that we have set AutoGenerateEditButton to true but have not auto generated the delete button. We have created a template field and added a LinkButton to it with &lt;span style="color: #ff3333"&gt;ID&lt;/span&gt;&lt;span style="color: #3333ff"&gt;="DeleteUser"&lt;/span&gt;. Note the &lt;span style="color: #ff3333"&gt;CommandName&lt;/span&gt;&lt;span style="color: #3333ff"&gt;="Delete"&lt;/span&gt; which auto-wires the delete button to the GridView.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Next step is to code up the GridViews RowDataBound event. As each row is bound to the GridView we search for the Delete LinkButton and customise the OnClientClick property. We use a simple JavaScript confirm function that returns true if the user clicks OK, otherwise false. &lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; GvUsers_RowDataBound(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.UI.WebControls.GridViewRowEventArgs) _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; GvUsers.RowDataBound&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; add a confirm button to the delete button&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; We are only interested in datarows&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; e.Row.RowType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DataControlRowType.DataRow &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; make sure we can find the control first&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; e.Row.FindControl(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DeleteUser&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; cast it to a LinkButton and set the client script&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;CType&lt;/span&gt;&lt;span style="color: #000000"&gt;(e.Row.FindControl(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DeleteUser&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;), LinkButton).OnClientClick &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;return confirm('Are you sure you want to delete &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            e.Row.Cells(&lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;).Text.Replace(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;\'&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; from the database?');&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;You can see we are concatenating a display message with a value from the Name field on the GridView. Single quotes cause issues with the JavaScript so we need to escape them by prefixing them with a backslash &lt;span style="color: #3333ff"&gt;e.Row.Cells(&lt;span&gt;3&lt;/span&gt;&lt;span&gt;).Text.Replace(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;\'&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;. This takes care of names like O'Malley etc.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now when your users hit delete they will receive a much more detailed message like the one below.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="deleteconfirm" border="0" alt="deleteconfirm" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TGeMga_pRFI/AAAAAAAAF6g/CTjxfkEFX5U/deleteconfirm%5B2%5D.gif?imgmax=800" width="393" height="130"&gt; &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;As you can see this is a very simple technique to add into your web applications. I think this approach is much better than having users on the phone asking for a database restore as they have mistakenly deleted your top customer!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-4379692822382629913?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/4379692822382629913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2006/09/friendly-gridview-deletion-messages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/4379692822382629913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/4379692822382629913'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2006/09/friendly-gridview-deletion-messages.html' title='Friendly GridView Deletion Messages'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_BYGp_3Y5xXE/TGeMga_pRFI/AAAAAAAAF6g/CTjxfkEFX5U/s72-c/deleteconfirm%5B2%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-619507307257852537.post-4820585266461405009</id><published>2006-09-02T16:03:00.000+10:00</published><updated>2010-08-15T16:04:16.119+10:00</updated><title type='text'>Optimistic Concurrency With SQL Server Rowversion Data Type</title><content type='html'>&lt;p&gt;Last updated : 2nd September 2006&lt;/p&gt; &lt;p style="text-align: right"&gt;&lt;/p&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;You are developing a multi-user web based system that involves users updating shared data. Therefore you need to make sure that users do not overwrite each others updates. For deletes, you want to make sure that the record to be deleted has not been modified by another user between the time you retrieved it from the database and the time you eventually delete it. &lt;/p&gt; &lt;p&gt;SQL Server has column type rowversion (synonym timestamp) which automatically changes its value whenever a row is modified in the database. This makes it an ideal candidate to enforce an optimistic concurrency solution. The rowversion field contains a binary value of 8 bytes. &lt;/p&gt; &lt;h2&gt;Strategy&lt;/h2&gt; &lt;p&gt;We will use a GridView bound to an ObjectDataSource to present the data to our users. We then retrieve the rowversion binary value from SQL Server as part of the data. As we need this value to validate our updates and deletes we will convert it to a string representation and hold it in the Gridview.&lt;/p&gt; &lt;p&gt;On updates and deletes we will convert the rowversion string representation back into a binary value and use this to qualify the SQL update and delete statements. &lt;/p&gt; &lt;p&gt;I will split this tutorial in to four main sections.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href="#step1"&gt;Table Design&lt;/a&gt; &lt;li&gt;&lt;a href="#step2"&gt;Stored Procedures&lt;/a&gt; &lt;li&gt;&lt;a href="#step3"&gt;Data Access Layer&lt;/a&gt; &lt;li&gt;&lt;a href="#step4"&gt;User Interface&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;&lt;a id="step1"&gt;Step 1 - Table Design&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;We will create a simple users table to demonstrate this technique. We will create a unique index on the email field to prevent duplicate email addresses in the system. This should prevent records being created twice by different users.&lt;/p&gt; &lt;div id="tabledesign" class="codebox"&gt; &lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Users&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;int&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff00ff"&gt;IDENTITY&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #808080"&gt;NOT&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;KEY&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;CLUSTERED&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #808080"&gt;NOT&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Email&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #808080"&gt;NOT&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Telephone&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Hiredate&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;datetime&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Dataversion&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;rowversion&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;NOT&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    )&lt;br /&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;UNIQUE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NONCLUSTERED&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;INDEX&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;IX_UsersUniqueEmail&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Users&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;(&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Email&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;PRIMARY&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;a id="step2"&gt;Step 2 - Stored Procedures&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Create stored procedures to perform CRUD activities against the database&lt;/p&gt;&lt;br /&gt;&lt;ol style="list-style-type: upper-roman"&gt;&lt;br /&gt;&lt;li&gt;Select all users&lt;br /&gt;&lt;li&gt;Insert a new user&lt;br /&gt;&lt;li&gt;Update a users details&lt;br /&gt;&lt;li&gt;Delete a user&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;The select stored procedure just grabs all users from the database. The Insert is straight forward, any duplicates entries will fail because of the unique index we have on the email address.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;On the Update stored procedure note the WHERE clause. We are updating the record based on the rows unique identifier &lt;strong&gt;AND&lt;/strong&gt; the rowversion that we previously retreived from the database. Remember, if there any data modifications on that row SQL Server will change the rowversion value automatically. So if the row was changed the update will affect zero rows.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Again for the Delete stored procedure note the WHERE clause. we qualify both the&amp;nbsp; unique identifier &lt;strong&gt;AND&lt;/strong&gt; the rowversion value.&lt;/p&gt;&lt;br /&gt;&lt;div id="storedprocs" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Author: Martin Millar&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Create date: Sat 12th Aug 2006&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Description:    Retreive all users in the database&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt;              Large tables may require paging &lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Version: 1.0&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;proc_SelectUsers&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;AS&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;BEGIN&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;SET&lt;/span&gt;&lt;span style="color: #000000"&gt; NOCOUNT &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Email&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Telephone&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;HireDate&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Dataversion&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Users&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Author: Martin Millar&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Create date: Sat 12th Aug 2006&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Description:    Insert new user in database&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Version: 1.0&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;proc_UserInsert&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Email&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Hiredate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;datetime&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Telephone&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;AS&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;BEGIN&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;INSERT&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;INTO&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Articles&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Users&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Email&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Telephone&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Hiredate&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;VALUES&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          (&lt;/span&gt;&lt;span style="color: #008000"&gt;@Name&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          ,&lt;/span&gt;&lt;span style="color: #008000"&gt;@Email&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          ,&lt;/span&gt;&lt;span style="color: #008000"&gt;@Telephone&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          ,&lt;/span&gt;&lt;span style="color: #008000"&gt;@Hiredate&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Author: Martin Millar&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Create date: Sat 12th Aug 2006&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Description:    Update user details&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Version: 1.0&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;proc_UpdateUser&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@ID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Email&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Telephone&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold"&gt;50&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Hiredate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;datetime&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Dataversion&lt;/span&gt;&lt;span style="color: #000000"&gt; rowversion&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;AS&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;BEGIN&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;UPDATE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Users&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;SET&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Name&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Email&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Email&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Telephone&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Telephone&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        ,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Hiredate&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Hiredate&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000"&gt; (ID&lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;@ID&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #808080"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; (Dataversion &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Dataversion&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Author: Martin Millar&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Create date: Sat 12th Aug 2006&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Description:    Deletes user from the database&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; Version: 1.0&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;--&lt;/span&gt;&lt;span style="color: #008080"&gt; =============================================&lt;/span&gt;&lt;span style="color: #008080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;proc_DeleteUser&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@ID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;@Dataversion&lt;/span&gt;&lt;span style="color: #000000"&gt; rowversion&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;AS&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;BEGIN&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;DELETE&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Users&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000"&gt; (ID &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@ID&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #808080"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; (Dataversion &lt;/span&gt;&lt;span style="color: #808080"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;@Dataversion&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;a id="step3"&gt;Step 3 - Data Access Layer&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;For the data access layer I have implemented a static class with with a private constructor so that it can't be instantiated. I have 'garnished' the class definition with the &lt;span style="color: #3333ff"&gt;&amp;lt;ComponentModel.DataObject()&amp;gt;&lt;/span&gt; attribute. Basically this allows the ObjectDataSource that we will use later on to correctly identify that this is a data component. I will also set method attributes on the Select, Insert, Update and Delete routines. Again this allows the ObjectDataSourceControl to easily identify which methods are used for CRUD operations.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I will be using the SQLClient classes of the System.Data namespace. The download comes with a SQL Express database. However I have included a sql script to add the necessary objects to a SQL 2000/2005 database.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Select Method&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;I will be returning a DataTable back to the UI layer containing all rows in the user table.&lt;/p&gt;&lt;br /&gt;&lt;div id="fill" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ComponentModel.DataObjectMethodAttribute(ComponentModel.DataObjectMethodType.Select, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; FillUsers() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; DataTable&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; connection &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection( _&lt;br /&gt;        ConfigurationManager.ConnectionStrings(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;MySQLDatabase&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ConnectionString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlCommand()&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Connection &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; connection&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; CommandType.StoredProcedure&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;proc_SelectUsers&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; adapter &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlDataAdapter(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; table &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; DataTable &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; DataTable&lt;br /&gt;                adapter.Fill(table)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;&lt;span style="color: #000000"&gt; table&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Insert Method&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Before I go through this I'll quickly touch on nullable types. The Telephone and HireDate fields are nullable in our database. This is not a problem for string values as they are &lt;strong&gt;reference&lt;/strong&gt; types and intrinsically have the concept of null or nothing values. However HireDate is a datetime &lt;strong&gt;value&lt;/strong&gt; which is a value type.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Value types are stored on the stack and have no concept of nulls. Hence we need to add this functionality by wrapping it in a &lt;span style="color: #3333ff"&gt;nullable&lt;/span&gt; structure. When we do this we can check the &lt;span style="color: #3333ff"&gt;.HasValue&lt;/span&gt; property to check for nulls.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The insert method checks the RowsAffected property of the ExecuteNonQuery method and throws an exception if the insert has failed. Remember though we have a unqiue index on email so duplicate records will throw a SQLException prior to this.&lt;/p&gt;&lt;br /&gt;&lt;div id="insert" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ComponentModel.DataObjectMethodAttribute(ComponentModel.DataObjectMethodType.Insert, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; InsertUser(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; name &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; email &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; telephone &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; hireDate &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Nullable(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Of&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; RecsAffected &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; connection &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection(ConfigurationManager.ConnectionStrings(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;MySQLDatabase&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ConnectionString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlCommand()&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Connection &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; connection&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; CommandType.StoredProcedure&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;proc_UserInsert&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Add the parameters&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, name))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Email&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, email))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Telephone&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IIf&lt;/span&gt;&lt;span style="color: #000000"&gt;(telephone &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;, telephone, System.DBNull.Value)))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Hiredate in SQL Table is nullable so we need to wrap the value type&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; in the nullable wrapper and check for the existance of a value&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;HireDate&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IIf&lt;/span&gt;&lt;span style="color: #000000"&gt;(hireDate.HasValue, hireDate, System.DBNull.Value)))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; open, execute and return&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            connection.Open()&lt;br /&gt;            RecsAffected &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.ExecuteNonQuery&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; RecsAffected &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; ApplicationException(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Failed to insert new user into the database.&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Update Method &lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Note the signature on the update method. When coding data components it's worth remembering the idiosyncrasies of the controls that you will be using. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;For example, I'm using original_id name as input parameter to the update method. Why? - because by default the ObjectDataSource will hold this key value in the a collection prefixed with &lt;span style="color: #3333ff"&gt;original_&lt;/span&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This can be changed by modifying the attribute in the Object DataSource. &lt;br&gt;&lt;span style="color: #ff0000" class="style2"&gt;OldValuesParameterFormatString&lt;/span&gt;="&lt;span style="color: #0000ff" class="style1"&gt;original_{0}&lt;/span&gt;"&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Also note that I'm passing the rowversion in as a byte array. As you will see later, you could just as easily pass this in as a string and perform a coversion back to a byte array value in method itself.&lt;/p&gt;&lt;br /&gt;&lt;div id="update" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ComponentModel.DataObjectMethodAttribute(ComponentModel.DataObjectMethodType.Update, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; UpdateUser(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; original_id &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; name &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; email &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; telephone &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; hireDate &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Nullable(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Of&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;&lt;span style="color: #000000"&gt;) _&lt;br /&gt;                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; dataVersion &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Byte&lt;/span&gt;&lt;span style="color: #000000"&gt;())&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; RecsAffected &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; connection &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection(ConfigurationManager.ConnectionStrings(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;MySQLDatabase&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ConnectionString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlCommand()&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Connection &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; connection&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; CommandType.StoredProcedure&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;proc_UpdateUser&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Add the parameters&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;ID&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, original_id))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, name))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Email&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, email))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Telephone&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IIf&lt;/span&gt;&lt;span style="color: #000000"&gt;(telephone &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;, telephone, System.DBNull.Value)))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Hiredate in SQL Table is nullable so we need to wrap the value type&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; in the nullable wrapper and check for the existance of a value&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;HireDate&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IIf&lt;/span&gt;&lt;span style="color: #000000"&gt;(hireDate.HasValue, hireDate, System.DBNull.Value)))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Now pass in the DataRowVersion that was retrieved from the database&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; We compare this with the value currently in the database. If these&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; values differ we do NOT want to overwrite with our changes&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DataVersion&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, dataVersion))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; open, execute and return&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            connection.Open()&lt;br /&gt;            RecsAffected &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.ExecuteNonQuery&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; RecsAffected &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; ApplicationException(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Another user has changed this record. &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                                            &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Your update was cancelled.&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Delete Method&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;For the delete method we will need both the ID and the Dataversion of the row to delete. Again I'm sticking to the format &lt;span style="color: #0000ff" class="style1"&gt;original_&lt;/span&gt; prefix. &lt;/p&gt;&lt;br /&gt;&lt;div id="delete" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ComponentModel.DataObjectMethodAttribute(ComponentModel.DataObjectMethodType.Delete, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; DeleteUser(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; original_id &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 _&lt;br /&gt;                               , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; original_dataVersion &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Byte&lt;/span&gt;&lt;span style="color: #000000"&gt;())&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; We only want to delete if the user has the latest version of the record&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; RecsAffected &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; connection &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlConnection(ConfigurationManager.ConnectionStrings(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;MySQLDatabase&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).ConnectionString)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlCommand()&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Connection &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; connection&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandType &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; CommandType.StoredProcedure&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.CommandText &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;proc_DeleteUser&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Add the parameters&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;ID&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, original_id))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Now pass in the DataRowVersion that was retrieved from the database&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; We compare this with the value currently in the database. If these&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; values differ we do NOT want to delete it&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.Parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; SqlParameter(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DataVersion&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, original_dataVersion))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; open, execute and return&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;            connection.Open()&lt;br /&gt;            RecsAffected &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;command&lt;/span&gt;&lt;span style="color: #000000"&gt;.ExecuteNonQuery&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; RecsAffected &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; ApplicationException(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Another user has changed this record. &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;                                            &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;User has NOT been deleted.&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Using&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Thats the data access sorted so we'll moved to the user interface.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;a id="step4"&gt;Step 4 - User Interface&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;For the user interface we will use a GridView control that is wired to an ObjectDataSource. For inserts I have just created some textboxes but you could easily use the FormView or DetailsView controls. The finished page is shown below.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ui_screen" border="0" alt="ui_screen" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TGeDTMFss1I/AAAAAAAAF5s/MOI4jSelqOU/ui_screen%5B6%5D.gif?imgmax=800" width="604" height="292"&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;So first drag an ObjectDataSource onto the web form and set the Business Object to the data access class. Because we set the proper method attributes on the business object all the methods will be pre-selected. I have included screenshots for reference.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_BYGp_3Y5xXE/TGeDTn9YAbI/AAAAAAAAF5w/EfdfqtaBdOs/s1600-h/ods_pick%5B3%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ods_pick" border="0" alt="ods_pick" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TGeDUcMlj9I/AAAAAAAAF50/JTc6A4Kov6A/ods_pick_thumb%5B1%5D.gif?imgmax=800" width="584" height="454"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_BYGp_3Y5xXE/TGeDU9YssxI/AAAAAAAAF54/nS9EBFw4on4/s1600-h/ods_select%5B3%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ods_select" border="0" alt="ods_select" src="http://lh3.ggpht.com/_BYGp_3Y5xXE/TGeDVll12SI/AAAAAAAAF58/sOBJO2B3FR8/ods_select_thumb%5B1%5D.gif?imgmax=800" width="584" height="454"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ods_update" border="0" alt="ods_update" src="http://lh6.ggpht.com/_BYGp_3Y5xXE/TGeDWL7aJAI/AAAAAAAAF6A/06_r3-NUowU/ods_update%5B4%5D.gif?imgmax=800" width="584" height="454"&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ods_insert" border="0" alt="ods_insert" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TGeDW97l2kI/AAAAAAAAF6E/vZLTELSqN5s/ods_insert%5B2%5D.gif?imgmax=800" width="584" height="454"&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ods_delete" border="0" alt="ods_delete" src="http://lh4.ggpht.com/_BYGp_3Y5xXE/TGeDXcKbW3I/AAAAAAAAF6I/Hhj26NAsJvY/ods_delete%5B2%5D.gif?imgmax=800" width="584" height="454"&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In the source code of the page you should now see the following mark-up. &lt;/p&gt;&lt;br /&gt;&lt;div id="objectdatasource" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:ObjectDataSource &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ObjectDataSource1"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; DeleteMethod&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DeleteUser"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;        InsertMethod&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="InsertUser"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; OldValuesParameterFormatString&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="original_{0}"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;br /&gt;        SelectMethod&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="FillUsers"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;        TypeName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Bracora.Articles.Users"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; UpdateMethod&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="UpdateUser"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DeleteParameters&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="original_id"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Int32"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="original_dataVersion"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Object"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DeleteParameters&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateParameters&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="original_id"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Int32"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="String"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="String"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="String"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="hireDate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DateTime"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="dataVersion"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Object"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UpdateParameters&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InsertParameters&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="String"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="String"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="String"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Parameter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="hireDate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DateTime"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;InsertParameters&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:ObjectDataSource&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Next, drag on a GridView Control and set its datasource to the ObjectDataSource. I like to manually specify the fields so I set the &lt;span style="color: #ff0000" class="style2"&gt;AutoGenerateColumns&lt;/span&gt; to false. I have also created two template columns.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;One for the Delete button as we want to specify a custom JavaScript confirmation to fire. I don't like the standard 'Are you sure you wish to delete this?' type message. For more information on this see my article &lt;a href="GridviewDelete.aspx"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;li&gt;One is for a hidden label to hold the rowversion data which is converted into a string representation as it binds to the grid. Look for the code below in the DataRowVersion template field :&lt;br&gt;&lt;span style="font-family: 'Courier New'; font-size: 10pt"&gt;System.Convert.ToBase64String(Eval("DataVersion"))&lt;br&gt;&lt;/span&gt;This gives us access to this value during updates and deletes. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;The final GridView markup is shown below.&lt;/p&gt;&lt;br /&gt;&lt;div id="gridview" class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:GridView &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="GvUsers"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; DataKeyNames&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; AutoGenerateColumns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;   AutoGenerateEditButton&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; DataSourceID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ObjectDataSource1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Columns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TemplateField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ShowHeader&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:LinkButton &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DeleteUser"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; CausesValidation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;                   CommandName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Delete"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Delete"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:LinkButton&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TemplateField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; ReadOnly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="True"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ID"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Name"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Email"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Telephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;DataField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Hiredate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Hiredate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; SortExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Hiredate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TemplateField &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Visible&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; HeaderText&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DataRowVersion"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Label &lt;/span&gt;&lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DataVersion"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;br /&gt;                   Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;='&amp;lt;%# &lt;/span&gt;&lt;span style="color: #ff0000"&gt;System.Convert.ToBase64String(Eval("DataVersion")) %&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;'&amp;gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TemplateField&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Columns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:GridView&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;All we need to do is plug in the code to handle CRUD operations in the user interface.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Both the GridView and the ObjectDataSource have complimentary events that fire during CRUD changes. I refer to these as &lt;strong&gt;ing&lt;/strong&gt; and &lt;strong&gt;ed&lt;/strong&gt; events e.g. &lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;RowUpdat&lt;strong&gt;ing&lt;/strong&gt; and RowUpdat&lt;strong&gt;ed&lt;/strong&gt; &lt;br /&gt;&lt;li&gt;RowDelet&lt;strong&gt;ing&lt;/strong&gt; and RowDelet&lt;strong&gt;ed&lt;/strong&gt; &lt;br /&gt;&lt;li&gt;Insert&lt;strong&gt;ing&lt;/strong&gt; and Insert&lt;strong&gt;ed&lt;/strong&gt; &lt;br /&gt;&lt;li&gt;....... &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;The &lt;strong&gt;ing&lt;/strong&gt; events allow you to perform processing &lt;strong&gt;before&lt;/strong&gt; your database operation such as validation, business rules checks....etc&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The &lt;strong&gt;ed&lt;/strong&gt; events allow you to perform processing &lt;strong&gt;after&lt;/strong&gt; the database operation such as exception handling, clean-up code...etc&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I'll take each operations in turn&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;GridView - Update &lt;/h3&gt;&lt;br /&gt;&lt;p&gt;For updates, we want to make sure that if we submit a change to the database that we do not overwrite any changes that another user may have made while we were in the process of editing the record. Remember multiple users will have access to the same common data.&lt;/p&gt;&lt;br /&gt;&lt;p class="bold"&gt;We only update the row if the rowversion we fetched from the database is the same as the one that is currently stamped on that row in SQL Server. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;As mentioned before we do this by qualifying this in the WHERE clause of the Update statement. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;To handle Updates we will use the &lt;span style="color: #3333ff"&gt;GridView_RowUpdating&lt;/span&gt; and &lt;span style="color: #3333ff"&gt;ObjectDataSource_Updated&lt;/span&gt; events.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;GridView_RowUpdating&lt;/strong&gt; - We have access to the NewValues dictionary at this point which is passed to ObjectDataSource for the update operation. The non key parameters are already populated. However we need to set the value of the original_rowversion parameter from the hidden Label control in the Template field of the GridView and convert it from its string representation back into a byte array.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;ObjectDataSource_Updated&lt;/strong&gt; - We just check to see if there were any exceptions and display them in the UI. Make sure you set the &lt;span style="color: #3333ff"&gt;e.ExceptionHandled = True&lt;/span&gt; otherwise the exception will continue to bubble up.&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; GvUsers_RowUpdating(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.UI.WebControls.GridViewUpdateEventArgs) _&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; GvUsers.RowUpdating&lt;br /&gt;        e.NewValues(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DataVersion&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; _&lt;br /&gt;            Convert.FromBase64String(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;CType&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.GvUsers.Rows(e.RowIndex).FindControl(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DataVersion&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;), Label).Text)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; ObjectDataSource1_Updated(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs) _&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; ObjectDataSource1.Updated&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; handle any Update exceptions here&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; e.Exception &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            DisplayUIError(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;IIf&lt;/span&gt;&lt;span style="color: #000000"&gt;(e.Exception.InnerException &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Is&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;, e.Exception.Message, e.Exception.InnerException.Message))&lt;br /&gt;            e.ExceptionHandled &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h3&gt;GridView - Delete&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;When deleting records from the GridView we don't want users to delete rows that may have been modified by another user after the data was retrieved. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;To handle Deletes we will use the &lt;span style="color: #3333ff"&gt;GridView_RowDeleting&lt;/span&gt;, &lt;span style="color: #3333ff"&gt;ObjectDataSource_Deleting&lt;/span&gt; and &lt;span style="color: #3333ff"&gt;ObjectDataSource_Deleted&lt;/span&gt; events.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;GridView_RowDeleting &lt;/strong&gt;- We store a string representation of the Dataversion field for the deleted row in a page level variable called &lt;em&gt;&lt;span style="color: #3333ff"&gt;DeletedRowVersion&lt;/span&gt;.&lt;/em&gt; This is taken from the hidden Label control in the Template field of the GridView. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;ObjectDataSource_Deleting&lt;/strong&gt; - We have access to the InputParameters dictionary at this point which is used for the delete operation. The original_ID is already populated because it is the DataKeyField of the GridView. Therefore we just need to set the value of the original_rowversion parameter. We get this from the Page variable &lt;em&gt;&lt;span style="color: #3333ff"&gt;DeletedRowVersion&lt;/span&gt;&lt;/em&gt;&amp;nbsp; which we set when the GridView entered edit mode. We convert this from its string representation back into a byte array. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;ObjectDataSource_Deleted&lt;/strong&gt; - We just check for exceptions and display them in the UI.&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; DeletedRowVersion &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; GvUsers_RowDeleting(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.UI.WebControls.GridViewDeleteEventArgs) _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; GvUsers.RowDeleting&lt;br /&gt;&lt;br /&gt;              DeletedRowVersion &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;CType&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.GvUsers.Rows(e.RowIndex).FindControl(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DataVersion&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;), Label).Text&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; ObjectDataSource1_Deleting(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.UI.WebControls.ObjectDataSourceMethodEventArgs) _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; ObjectDataSource1.Deleting&lt;br /&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; DeleteParams &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; IDictionary &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; e.InputParameters&lt;br /&gt;              DeleteParams(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;original_dataVersion&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; Convert.FromBase64String(DeletedRowVersion)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; ObjectDataSource1_Deleted(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs) _&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; ObjectDataSource1.Deleted&lt;br /&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; handle any delete exceptions here&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; e.Exception &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IsNot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    DisplayUIError(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;IIf&lt;/span&gt;&lt;span style="color: #000000"&gt;(e.Exception.InnerException &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Is&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;, e.Exception.Message, e.Exception.InnerException.Message))&lt;br /&gt;                    e.ExceptionHandled &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h3&gt;GridView - Inserts&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;For the inserts we will just create an input form above the GridView. The use of a FormView or DetailsView control is perfectly valid as well. I have included the code for reference.&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fieldset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;legend&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;New User Details&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;legend&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;table&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;tr &lt;/span&gt;&lt;span style="color: #ff0000"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="font-weight: bold;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="txtName"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             Email&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="txtEmail"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             Telephone&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="txtTelephone"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;              Hire Date&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="txtHireDate"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:Button &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="btnAddUser"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Add New User"&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;td&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;tr&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;table&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fieldset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Concurrency is not so much of an issue on the insert. However we do want to prevent two users keying in duplicate data. For example, Operator A keys in 50 new clients from a list of paper forms. Operator B comes in on the next shift, sees the paper forms and keys them in again. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;To prevent this we have set up a unique index on email address. An SQLException will be thrown if any attempt is made to insert duplicate email addresses.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here is the Insert code&lt;/p&gt;&lt;br /&gt;&lt;div class="codebox"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; btnAddUser_Click(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; sender &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; System.EventArgs) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt;&lt;span style="color: #000000"&gt; btnAddUser.Click&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; tmpHireDate &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; DateTime&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; txtHireDate.Text.Trim &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;""&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; must be value, so check it &lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;                DateTime.TryParse(txtHireDate.Text.Trim, tmpHireDate)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; tmpHireDate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DateTime.MinValue &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    DisplayUIError(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;The Hire date is not recognised as a valid date. Please correct.&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Exit&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;            Bracora.Articles.Users.InsertUser(txtName.Text.Trim _&lt;br /&gt;                                            , txtEmail.Text.Trim _&lt;br /&gt;                                            , txtTelephone.Text.Trim _&lt;br /&gt;                                            , &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IIf&lt;/span&gt;&lt;span style="color: #000000"&gt;(tmpHireDate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DateTime.MinValue, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000"&gt;, tmpHireDate))&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;&lt;span style="color: #000000"&gt;.GvUsers.DataBind()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;&lt;span style="color: #000000"&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Exception&lt;br /&gt;            DisplayUIError(ex.Message)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;In this article I have presented you with one technique to control modifications to shared data in multi-user environments. The rowversion column type is an ideal candidate for handling concurrency with SQL Server databases. Just to reiterate there are other methods to handle this situation but I think this is particularly 'clean'. Hopefully you will take this example and enhance it to suit your own situation. You may want to automatically re-load the data back into the UI if changes have occurred. It's up to you (or your customer) to decide the best route for each application.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/619507307257852537-4820585266461405009?l=bracora.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bracora.blogspot.com/feeds/4820585266461405009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://bracora.blogspot.com/2006/09/optimistic-concurrency-with-sql-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/4820585266461405009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/619507307257852537/posts/default/4820585266461405009'/><link rel='alternate' type='text/html' href='http://bracora.blogspot.com/2006/09/optimistic-concurrency-with-sql-server.html' title='Optimistic Concurrency With SQL Server Rowversion Data Type'/><author><name>Martin</name><uri>http://www.blogger.com/profile/02251799045385543538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_BYGp_3Y5xXE/TGeDTMFss1I/AAAAAAAAF5s/MOI4jSelqOU/s72-c/ui_screen%5B6%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
