<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Suman Chakrabarti - SharePoint and ASP.NET blog : .NET</title><link>http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx</link><description>Tags: .NET</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Presentation at CodeCamp Pittsburgh</title><link>http://blogs.msdn.com/sumanc/archive/2008/04/14/presentation-at-codecamp-pittsburgh.aspx</link><pubDate>Mon, 14 Apr 2008 18:47:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8393189</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/8393189.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=8393189</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=8393189</wfw:comment><description>&lt;p&gt;I presented a Silverlight 1.0/2.0 demonstration yesterday at CodeCamp and it went quite well. Most importantly, it compiled; hey, that's half the battle.&lt;/p&gt;  &lt;p&gt;The talk started out about how POX is not truly a ReST service because POX services are not usually provided as post-able services that control and manage information processing. With POX services, the idea is really to share the information with the user interface. So, I put together a service that provided customer order information from the AdventureWorks catalog. The information was provided in JSON format to the front end Silverlight 1.0 and 2.0 interface.&lt;/p&gt;  &lt;p&gt;The Silverlight 1.0 portion of the demo went really fast, mainly because I kept the JavaScript in code snippets so I wouldn't end up debugging any of it. The Silverlight 2.0 piece took some time because I had to write all the code from scratch because I forgot to save the code in snippets. It did look like I knew what I was doing, though.&lt;/p&gt;  &lt;p&gt;Anyways, thanks to Mike Snell, Craig Oaks, and Dave Hoerster for hosting CodeCamp! It was a fun time and I got to eat burritos.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8393189" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Advanced UserControl stuff for easier customization</title><link>http://blogs.msdn.com/sumanc/archive/2007/11/28/advanced-usercontrol-stuff-for-easier-customization.aspx</link><pubDate>Thu, 29 Nov 2007 03:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6588351</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/6588351.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=6588351</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=6588351</wfw:comment><description>&lt;P&gt;I put together this post on my old blog about 2 years ago and was recently asked questions about this tip. I figure it will get more readership on my MSDN blog, so here goes.&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;FONT face="trebuchet ms"&gt;There are some great advantages of UserControls, but the favored advantage is the fact that it does not require recompilation of code to change the look &amp;amp; feel of content.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="trebuchet ms"&gt;&lt;SPAN style="FONT-WEIGHT: bold; FONT-STYLE: italic"&gt;User controls are web controls.&lt;/SPAN&gt; Let's say you want to do some sort of skinning on a user control? Here's a simple method to give your user controls a heading--like a web part heading. &lt;/FONT&gt;&lt;FONT face="trebuchet ms"&gt;This code will give you the ability to skin the heading of your user control and allow you to place content within the user control on the ASPX page&lt;/FONT&gt; &lt;/P&gt;
&lt;P class=code&gt;&lt;CODE&gt;&lt;FONT face="courier new"&gt;[ParseChildren(true, "WebPartContent")]&lt;BR&gt;public class WebPart : UserControl {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected Label WebPartTitle;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected PlaceHolder WebPartContentPlaceholder;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Browsable(false)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PlaceHolder WebPartContent {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; get { return WebPartContentPlaceholder; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; set { WebPartContentPlaceholder = value; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Browsable(true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Title {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; get { return WebPartTitle.Text; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; set { WebPartTitle.Text = value; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/CODE&gt;&lt;/P&gt;&lt;FONT face="trebuchet ms"&gt;The ASCX control can look like this:&lt;/FONT&gt;&lt;BR&gt;
&lt;P class=code&gt;&lt;CODE&gt;&lt;FONT face="courier new"&gt;&lt;/FONT&gt;&amp;lt;div class="individual-layout"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="heading"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="heading-title"&amp;gt;&amp;lt;asp:Label runat="server" id="WebPartTitle" /&amp;gt;&amp;lt;/div&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="heading-collapse-button"&amp;gt;&amp;lt;asp:Button runat="server" id="HideButton" /&amp;gt;&amp;lt;/div&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Placeholder runat="server" id="WebPartContentPlaceholder" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;BR&gt;&amp;lt;/div&amp;gt;&lt;/CODE&gt;&lt;/P&gt;And the ASPX page can look like this: 
&lt;P class=code&gt;&lt;CODE&gt;&amp;lt;body&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;uc:WebPart runat="server" Title="Web part title"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; This is where my user control content will go...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/uc:WebPart&amp;gt;&lt;BR&gt;&amp;lt;/body&amp;gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT: bold; FONT-STYLE: italic"&gt;How does this work?&lt;/SPAN&gt; Someone recently asked me how this works. Well, it's important to understand webcontrol development to understand what's going on here. The [ParseChildren] attribute is giving the runtime a hint that the XML within my runat=server tag is really meant to be housed within another control. It acts like an XML schema &amp;lt;xs:any&amp;gt; tag and puts my content within my WebPartControlPlaceholder PlaceHolder's Controls collection. This is very similar to the way MasterPages are done in ASP.NET 2.0+.&lt;/P&gt;
&lt;P&gt;Anyways, I thought it was a good tip.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6588351" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>SharePoint development best practices on MSDN</title><link>http://blogs.msdn.com/sumanc/archive/2007/11/16/sharepoint-development-best-practices-on-msdn.aspx</link><pubDate>Fri, 16 Nov 2007 15:28:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6300589</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/6300589.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=6300589</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=6300589</wfw:comment><description>&lt;p&gt;Some great articles on SharePoint best practices have been published on MSDN.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/bb687949%28office.12%29"&gt;Best Practices: Common Coding Issues When Using the SharePoint Object Model&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/aa973248%28office.12%29"&gt;Best Practices: Using Disposable Windows SharePoint Services Objects&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/aa973249%28office.12%29"&gt;Creating a Windows SharePoint Services 3.0 Web Part Using Visual Studio 2005 Extensions&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/bb530302%28office.12%29"&gt;Development Tools and Techniques for Working with Code in Windows SharePoint Services 3.0 (Part 1 of 2)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/bb530301%28office.12%29"&gt;Development Tools and Techniques for Working with Code in Windows SharePoint Services 3.0 (Part 2 of 2)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/bb814929%28office.12%29"&gt;Usage Event Logging in Windows SharePoint Services 3.0&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/bb153523%28office.12%29"&gt;Working with ASP.NET 2.0 Web Parts and Windows SharePoint Services 3.0&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6300589" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/Branding/default.aspx">Branding</category></item><item><title>Surface Computing</title><link>http://blogs.msdn.com/sumanc/archive/2007/06/10/surface-computing.aspx</link><pubDate>Mon, 11 Jun 2007 01:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3214882</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/3214882.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=3214882</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=3214882</wfw:comment><description>&lt;P&gt;I've got to say the surface computing stuff is the coolest new invention. I can't wait to see this in restaurants.&lt;/P&gt;
&lt;P&gt;Here are some great links and videos (yes, it’s ironic that&amp;nbsp;the best online&amp;nbsp;press is available through Google’s YouTube):&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/surface" mce_href="http://www.microsoft.com/surface"&gt;http://www.microsoft.com/surface&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.youtube.com/results?search_query=microsoft+surface" mce_href="http://www.youtube.com/results?search_query=microsoft+surface"&gt;http://www.youtube.com/results?search_query=microsoft+surface&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;I think it's important to note that&amp;nbsp;under the covers, there is&amp;nbsp;still Windows Vista and the Windows Presentation Foundation.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3214882" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/Multimedia/default.aspx">Multimedia</category></item><item><title>Active Directory Activities for Windows Workflow Foundation posted</title><link>http://blogs.msdn.com/sumanc/archive/2006/12/21/active-directory-activities-in-windows-workflow-foundation.aspx</link><pubDate>Thu, 21 Dec 2006 19:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1340885</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/1340885.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=1340885</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=1340885</wfw:comment><description>&lt;P&gt;My Active Directory activities have been published to the &lt;A href="http://wf.netfx3.com/" mce_href="http://wf.netfx3.com"&gt;.NET 3.0 web site&lt;/A&gt;. They are available here: &lt;A href="http://wf.netfx3.com/files/folders/communications/entry7716.aspx" mce_href="http://wf.netfx3.com/files/folders/communications/entry7716.aspx"&gt;http://wf.netfx3.com/files/folders/communications/entry7716.aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I've included a simple sample and I will probably tag in an screenshot of a sample workflow. &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Enjoy!&lt;/EM&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1340885" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/Win+WF/default.aspx">Win WF</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/ADSI/default.aspx">ADSI</category></item><item><title>System.Data.Common data connections: Part 1 - Connecting with ConnectionStringSettings</title><link>http://blogs.msdn.com/sumanc/archive/2006/05/11/592596.aspx</link><pubDate>Thu, 11 May 2006 20:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:592596</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/592596.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=592596</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=592596</wfw:comment><description>This is a demonstration of how to connect to data sources using the DB provider-based&amp;nbsp;objects built into the .NET 2.0 framework. I've noticed a bit of confusion around programming for the new structures, so I'm going to put together a little guide on how to access data with this newly built-in, provider-driven model.&lt;BR&gt;&lt;BR&gt;In the .NET 2.0 data objects, a new namespace has been born....System.Data.Common. Its purpose is to abstract data logic from the code interaction with a specific database. This method is not new, but it is much easier to implement in the 2.0 framework and it provides a 'patterned' way of development.&lt;BR&gt;&lt;BR&gt;IMO, I highly recommend using the abstract class model in every scenario of data-driven development. Much like when everyone in the office buys a lottery ticket and I, the "anti-gambler", buy a ticket; it's purely preventative. I don't want to go down when everyone else wins, and you don't want to rewrite your data layer when the boss asks how long it will take to implement the same app with an Oracle DB.&lt;BR&gt;&lt;BR&gt;Enough of the rant and down to code.&lt;BR&gt;&lt;BR&gt;There are a few new classes that provide the construct for this kind of development:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;System.Data.Common.DbProviderFactories - provides a means of initilizing the appropriate concrete provider&lt;BR&gt;
&lt;LI&gt;System.Data.Common.DbProviderFactory - the initialized concrete provider&lt;BR&gt;
&lt;LI&gt;System.Configuration.ConnectionStringSettings - provides a means of storing/retrieving a data connection string and the provider to initialize.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;First things first, let's talk about the Connection Strings. The connection string format in the configuration file is the following:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;connectionStrings&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;add&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;DataConnectionString&lt;/SPAN&gt;"&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;connectionString&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;Provider=Microsoft.Jet.OLEDB.4.0;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Data Source=|DataDirectory|\AdventureWorks.mdb&lt;/SPAN&gt;"&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;providerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;System.Data.OleDb&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; /&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue; LINE-HEIGHT: 115%"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon; LINE-HEIGHT: 115%"&gt;connectionStrings&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue; LINE-HEIGHT: 115%"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;The parts of the System.Configuration.ConnectionStringSettings object&amp;nbsp;are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Name - the name of the connection string that is used for looking up the ConnectionStringSettings object 
&lt;LI&gt;ConnectionString - the connection string that is to be passed into the proper DB connection object 
&lt;LI&gt;ProviderName - the data provider factory name which will initialize a concrete instance of the appropriate DB connection class&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;EM&gt;&lt;FONT size=2&gt;NOTE: Before demonstrating the data provider factory connection method, it's important to note that if you are never going to switch between providers (Oracle, MS SQL Server, MySQL, OleDB), then the provider factory method can be skipped and you can simply use the connection string&amp;nbsp;with its corresponding provider (ex: new SqlConnection(ConnectionString)).&lt;/FONT&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The following code illustrates how to create&amp;nbsp;a DB connection using the data provider classes. Notice that this connection method provides an approach to getting a connection from an already created DbProviderFactory. The idea is to create a collection of already initialized providers, then all you are calling at runtime is the GetConnection() method of the DataManager class.&amp;nbsp; Additionally, IMO, I believe the returned connection should be stored in a local variable and reused rather than disposed.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;
&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt; System;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt; System.Collections.Generic;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt; System.Configuration;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt; System.Data.Common;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;DataManager&lt;/SPAN&gt;&lt;FONT color=#000000&gt; {&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;Dictionary&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;lt;&lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;FONT color=#000000&gt;, &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;DataConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;gt; _dbConnections;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt;&lt;FONT color=#000000&gt; DataManager() {&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// initialize the db factories&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;_dbConnections = &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;Dictionary&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;lt;&lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;FONT color=#000000&gt;, &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;DataConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;gt;(&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;ConfigurationManager&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.ConnectionStrings.Count);&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;foreach&lt;/SPAN&gt;&lt;FONT color=#000000&gt; (&lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;ConnectionStringSettings&lt;/SPAN&gt;&lt;FONT color=#000000&gt; cstring &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;ConfigurationManager&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.ConnectionStrings) {&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// initialize a new DbProviderFactory&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DbProviderFactory&lt;/SPAN&gt;&lt;FONT color=#000000&gt; factory =&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DbProviderFactories&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.GetFactory(cstring.ProviderName);&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// Initialize a new DataConnection object&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DataConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt; connection =&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;DataConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt;(cstring.ConnectionString, factory);&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// add the DataConnection to the dictionary&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// names will be unique because they are unique for&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// the ConnectionStringSettingsCollection object&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;_dbConnections.Add(cstrings.Name.ToLower(), connection);&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; Gets a connection using the configuration&lt;BR&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080&gt;/// &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;connection string name.&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;param name="connectionStringConfigName"&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; The name of the connection in the configuration file.&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;returns&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; An instantiated DbConnection with the applied connection string.&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;DbConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt; GetConnection(&lt;BR&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;string&lt;/SPAN&gt;&lt;FONT color=#000000&gt; connectionStringConfigName) {&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;&lt;FONT color=#000000&gt; (!_dbConnections.ContainsKey(&lt;BR&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;connectionStringConfigName.ToLower()))&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;throw&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;ConfigurationException&lt;/SPAN&gt;&lt;FONT color=#000000&gt;(&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"The data provider could not be initialized. "&lt;/SPAN&gt;&lt;FONT color=#000000&gt;+&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"Please recheck the configuration file."&lt;/SPAN&gt;&lt;FONT color=#000000&gt;);&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DataConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt; cn = _dbConnections[&lt;BR&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;connectionStringConfigName.ToLower()];&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;FONT color=#000000&gt; cn.CreateConnection();&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;DataConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt; {&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;FONT color=#000000&gt; _connectionString;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DbProviderFactory&lt;/SPAN&gt;&lt;FONT color=#000000&gt; _dbFactory;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;internal&lt;/SPAN&gt;&lt;FONT color=#000000&gt; DataConnection(&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;FONT color=#000000&gt; connectionString,&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DbProviderFactory&lt;/SPAN&gt;&lt;FONT color=#000000&gt; factory) {&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;_connectionString = connectionString;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;_dbFactory = factory;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;SPAN style="COLOR: teal"&gt;DbConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt; CreateConnection() {&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DbConnection&lt;/SPAN&gt;&lt;FONT color=#000000&gt; connection = _dbFactory.CreateConnection();&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;connection.ConnectionString = ConnectionString;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;FONT color=#000000&gt; connection;&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;
&lt;P style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'"&gt;&lt;FONT color=#000000&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;If you like this approach, I am going to go on about data connections in a future "Part 2" blog entry. I will go over the idea of creating a data provider for multiple data sources using an abstract factory provider.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=592596" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Custom collections data pattern</title><link>http://blogs.msdn.com/sumanc/archive/2006/05/05/CustomCollections.aspx</link><pubDate>Fri, 05 May 2006 21:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:590194</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/590194.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=590194</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=590194</wfw:comment><description>&lt;p&gt;I've put together a simple pattern for when I create new data driven objects that I'd like to share. This is the method I used in the 1.x framework for easily managing data objects. This is my version of the Lightweight Business Objects (LBO) approach.&lt;/p&gt;
&lt;p&gt;&lt;STRONG&gt;BaseDataObject Class&lt;/STRONG&gt;&lt;/p&gt;
&lt;p&gt;Let's take the situation where I have several data objects and I want to maintain all the object properties easily. &amp;nbsp;I create an abstract base class that represents a data object (&lt;span style="COLOR: blue; "&gt;public&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;abstract&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; BaseDataObject&lt;/span&gt;). The abstract class contains a default constructor that initializes a Hashtable where data properties are stored.&amp;nbsp;Then create an oveloaded&amp;nbsp;constructor that has an argument for the&amp;nbsp;System.Data.IDataReader:&lt;/p&gt;&lt;PRE&gt;&lt;p&gt;&lt;span&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; BaseDataObject(){&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_properties = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Hashtable();&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; BaseDataObject(IDataReader properties) : &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;() {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// writes data to properties collection&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;WriteData(properties);&lt;/span&gt;
&lt;span style="LINE-HEIGHT: 115%; "&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;
&lt;p&gt;The overloaded constructor calls a WriteData method which copies data from the DataReader to the Hashtable:&lt;/p&gt;&lt;PRE&gt;&lt;p&gt;&lt;span style="COLOR: blue; "&gt;void&lt;/span&gt;&lt;span&gt; WriteData(IDataReader properties) {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (properties.IsClosed)&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;throw&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; DataException(&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: maroon"&gt;"The IDataReader properties must be "&lt;/span&gt; +&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;"set to initialize a new Customer"&lt;/span&gt;);&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// the name that the value is stored under&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// is the name provided from the data source&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;for&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; properties.FieldCount; i++) {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;BaseSet(properties.GetName(i).ToLower(), properties[i]);&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span style="LINE-HEIGHT: 115%; "&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;
&lt;p&gt;I also provide methods to access the base data properties.&amp;nbsp; These are the BaseGet&amp;lt;T&amp;gt; and BaseSet methods:&lt;/p&gt;&lt;PRE&gt;&lt;p&gt;&lt;span style="COLOR: blue; "&gt;protected&lt;/span&gt;&lt;span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt;&lt;font color="#000000"&gt; T BaseGet&amp;lt;T&amp;gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color="#000000"&gt; name) {&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; &lt;font size=2&gt;BaseGet&amp;lt;T&amp;gt;(name, &lt;/font&gt;&lt;font color=#0000ff size=2&gt;default&lt;/font&gt;&lt;font size=2&gt;(T))&lt;/font&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;span style="COLOR: blue; "&gt;protected&lt;/span&gt;&lt;span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt;&lt;font color="#000000"&gt; T BaseGet&amp;lt;T&amp;gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color="#000000"&gt; name, T defaultValue) {&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color="#000000"&gt; (_properties[name] == &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; defaultValue;&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; (T)_properties[name];&lt;/font&gt;&lt;/span&gt;
&lt;span style=";color:#000000""&gt;}&lt;/span&gt;
&lt;span style="COLOR: blue; "&gt;protected&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; BaseSet(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; name, &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; value) {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_properties[name] = value;&lt;/span&gt;
&lt;span style="LINE-HEIGHT: 115%; "&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;
&lt;p&gt;This approach makes it easy to get a properly cast object and set a property in the hashtable cleanly. This also provides a central location to create functionality around setting data properties. An example could be&amp;nbsp;an IsDirty property or PropertyChanged event. Subclasses will use the BaseGet and BaseSet&amp;nbsp;methods to set properties they want to expose.&lt;/p&gt;
&lt;p&gt;Next, I attach a Save method.&amp;nbsp;Because the Save method is going to be different for every object, it would normally be an abstract method; however, I take this as an opportunity to setup&amp;nbsp;two events: Saving and Saved.&amp;nbsp;These events can be used to cancel the data save or maybe to redirect the user to another location when the data has been saved.&amp;nbsp;Here is the Save method:&lt;/p&gt;&lt;PRE&gt;&lt;p&gt;&lt;span style="COLOR: blue; "&gt;public&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Save(){&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// perform an action on the data before saving&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span style="COLOR: green"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // (possibly security validation)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;CancelEventArgs args = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; CancelEventArgs();&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OnSaving(args);&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (args.Cancel) &lt;span style="COLOR: blue"&gt;return&lt;/span&gt;;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// save the data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SaveInternal();&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// provide event for after the item is saved&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OnSaved(args);&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span style="COLOR: green; "&gt;// this is overridden in subclasses &lt;/span&gt;&lt;span style="COLOR: green; "&gt;to handle saving the object data&lt;/span&gt;
&lt;span style="COLOR: blue; "&gt;protected&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: blue"&gt;abstract&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; SaveInternal();&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style="COLOR: blue; "&gt;public&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;event&lt;/span&gt; CancelEventHandler Saving;&lt;/span&gt;
&lt;span style="COLOR: blue; LINE-HEIGHT: 115%; "&gt;public&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; "&gt; &lt;span style="COLOR: blue"&gt;event&lt;/span&gt; EventHandler Saved;&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;
&lt;p&gt;Notice that instead of providing an opportunity for a developer to override the Save method, an abstract method called SaveInternal is applied.&lt;/p&gt;
&lt;p&gt;To view the completed BaseDataObject, &lt;A href="#BaseDataObject"&gt;click here.&lt;/A&gt;&lt;/p&gt;
&lt;p&gt;&lt;STRONG&gt;Example: Customer class:&lt;/STRONG&gt;&lt;/p&gt;
&lt;p&gt;Now, I will make an example Customer class and demonstrate a controller class that will populate my data object.&lt;/p&gt;&lt;PRE&gt;&lt;p&gt;&lt;span style="COLOR: blue; "&gt;public&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt; : &lt;span style="COLOR: teal"&gt;BaseDataObject&lt;/span&gt; {&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; Customer() : &lt;span style="COLOR: blue"&gt;base&lt;/span&gt;() { }&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; Customer(&lt;span style="COLOR: teal"&gt;IDataReader&lt;/span&gt; properties) : &lt;span style="COLOR: blue"&gt;base&lt;/span&gt;(properties) { }&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// the property name ID differs from the database name CustomerID&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; ID {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; BaseGet&amp;lt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="COLOR: maroon"&gt;"customerid"&lt;/span&gt;, 0); }&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; FirstName {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; BaseGet&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="COLOR: maroon"&gt;"firstname"&lt;/span&gt;); }&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;set&lt;/span&gt; { BaseSet(&lt;span style="COLOR: maroon"&gt;"firstname"&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;); }&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; LastName {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; BaseGet&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="COLOR: maroon"&gt;"lastname"&lt;/span&gt;); }&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;set&lt;/span&gt; { BaseSet(&lt;span style="COLOR: maroon"&gt;"lastname"&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;); }&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: blue"&gt;override&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; SaveInternal() {&lt;/span&gt;
&lt;span&gt;&lt;font color="#006400"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DataManager is the static data class&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;&lt;font color="#006400"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // it provides CRUD data actions&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: teal"&gt;DataManager&lt;/span&gt;.SaveCustomer(ID, FirstName, LastName);&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span style="LINE-HEIGHT: 115%; "&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;
&lt;p style="MARGIN: 0in 0in 10pt"&gt;&lt;span style="LINE-HEIGHT: 115%; "&gt;&lt;/span&gt;&lt;STRONG&gt;CustomerManager class:&lt;/STRONG&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt"&gt;The CustomerManager class manages interactions between the CRUD data object (which I generally build using the System.Data.Common namespace) and the business logic.&amp;nbsp;So examples might be to get all the customers or&amp;nbsp;get&amp;nbsp;a customer by ID as in the example below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;PRE&gt;&lt;p&gt;&lt;span style="COLOR: blue; "&gt;public static&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: teal"&gt;CustomerManager&lt;/span&gt; {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: teal"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt;&amp;gt; GetCustomers() {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: teal"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt;&amp;gt; customers = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt;&amp;gt;();&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (&lt;span style="COLOR: teal"&gt;IDataReader&lt;/span&gt; data = &lt;span style="COLOR: teal"&gt;DataManager&lt;/span&gt;.GetCustomers()) {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;while&lt;/span&gt; (data.Read()) {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt; customer = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt;(data);&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;customers.Add(customer);&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; customers;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt; GetCustomer(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; customerID) {&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (&lt;span style="COLOR: teal"&gt;IDataReader&lt;/span&gt; data = &lt;span style="COLOR: teal"&gt;DataManager&lt;/span&gt;.GetCustomerByID(customerID)) {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (data.Read()) {&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt; customer = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;Customer&lt;/span&gt;(data);&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; customer;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;span style="LINE-HEIGHT: 115%; "&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;
&lt;p style="MARGIN: 0in 0in 10pt"&gt;You'll notice that the data from the CustomerManager object is used to abstract the data logic from the business logic.&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt"&gt;Now, to approach an actual case of using these objects, check out the following:&lt;/p&gt;&lt;PRE&gt;&lt;p style="FONT-SIZE: 10pt"&gt;&lt;span style="COLOR: teal"&gt;&lt;font face="Courier New"&gt;&lt;font color='#006400'&gt;// get all customers&lt;/font&gt;&lt;BR/&gt;List&lt;font color='"#000000"'&gt;&amp;lt;&lt;/font&gt;Customer&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#000000"&gt;customers&lt;/font&gt; = CustomerManager&lt;font color="#000000"&gt;.GetCustomers();&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;br/&gt;
&lt;span style="COLOR: teal"&gt;&lt;font face="Courier New" color='#006400'&gt;// get a single customer&lt;/font&gt;&lt;BR&gt;Customer &lt;font color="#000000"&gt;customer&lt;/font&gt; = CustomerManager&lt;font color="#000000"&gt;.GetCustomer(23);&lt;BR/&gt;&lt;font color='#006400'&gt;// modify customer and save&lt;/font&gt;
&lt;BR&gt;&lt;span&gt;customer.FirstName = &lt;span style="COLOR: maroon"&gt;"foo"&lt;/span&gt;;&lt;BR&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: teal"&gt;&lt;font face="Courier New" size=2&gt;&lt;font color="#000000"&gt;&lt;span&gt;customer.LastName = &lt;span style="COLOR: maroon"&gt;"bar"&lt;/span&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;customer.Save();&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;
&lt;p&gt;Let me know what you like or dislike about my approach. It's nothing great, but it works well and is better than the Typed DataSets (IMO).&lt;/p&gt;
&lt;p&gt;&lt;A name="BaseDataObject"&gt;&lt;/A&gt;&lt;strong&gt;BaseDataObject class:&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;PRE&gt;&lt;p&gt;&lt;span style="COLOR: blue; "&gt;public&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;abstract&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; BaseDataObject {&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; Hashtable _properties;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; BaseDataObject(){&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_properties = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Hashtable();&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; BaseDataObject(IDataReader properties) : &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;() {&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// writes data to properties collection&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;WriteData(properties);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt; WriteData(IDataReader properties) {&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (properties.IsClosed)&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;throw&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; DataException(&lt;span style="COLOR: maroon"&gt;"The IDataReader properties must be " &lt;font color="#000000"&gt;+&lt;/font&gt;&lt;BR&gt;&lt;span&gt;&lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;"set to initialize a new Customer"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// the name that the value is stored under&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span style="COLOR: green"&gt;        // is the name provided from the data source&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;for&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; properties.FieldCount; i++) {&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;BaseSet(properties.GetName(i).ToLower(), properties[i]);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Save(){&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// perform an action on the data before saving&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span style="COLOR: green"&gt;        // (possibly security validation)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;CancelEventArgs args = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; CancelEventArgs();&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OnSaving(args);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (args.Cancel) &lt;span style="COLOR: blue"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// save the data&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SaveInternal();&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// provide event for after the item is saved&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OnSaved(args);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// this is used by &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: blue"&gt;abstract&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; SaveInternal();&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;event&lt;/span&gt; CancelEventHandler Saving;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;event&lt;/span&gt; EventHandler Saved;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; OnSaving(CancelEventArgs args){&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (Saving != &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Saving(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;, args);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; OnSaved(EventArgs args){&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (Saved != &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Saved(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;, args);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; IDictionary Properties{&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; _properties; }&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0in 0in 0pt"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style="COLOR: blue"&gt;
&lt;span style="COLOR: blue; "&gt;    protected&lt;/span&gt;&lt;span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt;&lt;font color="#000000"&gt; T BaseGet&amp;lt;T&amp;gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color="#000000"&gt; name) {&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; &lt;font size=2&gt;BaseGet&amp;lt;T&amp;gt;(name, &lt;/font&gt;&lt;font color=#0000ff size=2&gt;default&lt;/font&gt;&lt;font size=2&gt;(T))&lt;/font&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;BR&gt;
&lt;span style="COLOR: blue; "&gt;    protected&lt;/span&gt;&lt;span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;internal&lt;/span&gt;&lt;font color="#000000"&gt; T BaseGet&amp;lt;T&amp;gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color="#000000"&gt; name, T defaultValue) {&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color="#000000"&gt; (_properties[name] == &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; defaultValue;&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; (T)_properties[name];&lt;/font&gt;&lt;/span&gt;
&lt;span&gt;    &lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;BR&gt;
&lt;span style="COLOR: blue; "&gt;    protected&lt;/span&gt;&lt;span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; BaseSet(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; name, &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; value) {&lt;/span&gt;
&lt;span&gt;    &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_properties[name] = value;&lt;/span&gt;
&lt;span style="LINE-HEIGHT: 115%; "&gt;    }&lt;/span&gt;
&lt;span style="LINE-HEIGHT: 115%; "&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=590194" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>