<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.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>/bill's House O Insomnia&lt;img src="http://www.williamgryan.com/images/originalcuckoo.jpg" alt="Bill Ryan" /&gt; : Data Access</title><link>http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx</link><description>Tags: Data Access</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Looking for some .NET Developers</title><link>http://msmvps.com/blogs/williamryan/archive/2008/06/06/looking-for-some-net-developers.aspx</link><pubDate>Sat, 07 Jun 2008 02:19:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1632527</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=1632527</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=1632527</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2008/06/06/looking-for-some-net-developers.aspx#comments</comments><description>&lt;p&gt;A client of mine located in the Aiken/Columbia South Carolina Area has asked me if I had any friends who are .NET Developers and looking for a job. They are looking for at least one Junior Developer, on Mid-Level Developer and several Senior developers.&amp;nbsp; I know these folks quite well and I can vouch for the following:&amp;nbsp; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;They pay extremely well&lt;/li&gt; &lt;li&gt;Generous benefits package&lt;/li&gt; &lt;li&gt;There&amp;#39;s plenty of cool people on their staff&lt;/li&gt; &lt;li&gt;They are growing at an explosive rate so there&amp;#39;s plenty of room for upward mobility. There&amp;#39;s also a very strong focus on learning/teaching and career development.&lt;/li&gt; &lt;li&gt;They are an Agile/SCRUM shop&lt;/li&gt; &lt;li&gt;Currently developing with the following technologies:&lt;/li&gt; &lt;ul&gt; &lt;li&gt; Visual Studio Team System 2008 / .NET 3.5 Framework&lt;/li&gt; &lt;li&gt;Windows Communication Foundation&lt;/li&gt; &lt;li&gt;Windows Presentation Foundation&lt;/li&gt; &lt;li&gt;ASP.NET&lt;/li&gt; &lt;li&gt;LINQ&lt;/li&gt; &lt;li&gt;Silverlight&lt;/li&gt; &lt;li&gt;Windows Mobile 5/ Windows Mobile 6/ .NET Compact Framework&lt;/li&gt; &lt;li&gt;Sql Server 2005 / Sql Server 2008&lt;/li&gt; &lt;li&gt;Windows Installer for XML&lt;/li&gt; &lt;li&gt;Sandcastle&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;If you&amp;#39;re in the area and looking for a job... if you know someone who looking for a job.... or if you&amp;#39;re willing to move, please drop me a line using the Contact option on&amp;nbsp; my blog or emailing me directly at &lt;a href="mailto://WilliamRyan@gmail.com"&gt;WilliamRyan@gmail.com&lt;/a&gt; and I&amp;#39;ll put you in contact with them.&amp;nbsp; They are looking to hire folks immediately so I can probably get you an interview within a few days.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Junior Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ideal candidate will be a recent college graduate with a Computer Science of MIS degree.&amp;nbsp; No experience is necessary for this position. The main soft-skill qualifications for this position are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A true love for development&lt;/li&gt; &lt;li&gt;Strong desire to learn&lt;/li&gt; &lt;li&gt;A desire to stand out among one&amp;#39;s peers&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; The hard-skill qualifications include a good theoretical understanding of at least two of the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Object Oriented Design and Analysis&lt;/li&gt; &lt;li&gt;Relational Database theory&lt;/li&gt; &lt;li&gt;Design Patterns&lt;/li&gt; &lt;li&gt;Familiarity with at least two of the following:&amp;nbsp; C, C++, Java, C#, VB.NET&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This is essentially a dream job for recent college grads b/c the job is being offered &amp;quot;no experience required&amp;quot;.&amp;nbsp; Since they are a SCRUM/Agile shop, you&amp;#39;ll get to work extensively with their Senior and Mid level devs via Pair Programming.&amp;nbsp;&amp;nbsp; You&amp;#39;ll be able to pick&amp;nbsp; an area to specialize in which you will decide on for yourself. Additionally, you&amp;#39;ll be using some of the most sought after Microsoft technologies available.&amp;nbsp; Go to Monster.com or Dice.com and see for yourself how much demand there is for the above technologies and how much those jobs pay.&amp;nbsp; You&amp;#39;ll get to work with these on day 1 and essentially carve out a path for yourself using whichever technologies you like the best.&amp;nbsp; If you want to be a &amp;quot;UI&amp;quot; expert, that&amp;#39;s where you&amp;#39;ll be put. If you want to be a Web Services dev, again, that&amp;#39;s what you can focus on.&amp;nbsp; If you want to be an expert buildmaster who specializes in installers, that&amp;#39;s what you&amp;#39;ll get to do.&amp;nbsp; The company is looking for some excellent candidates and willing to offer a really fun and great paying job with plenty of training and career development available.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Mid-Level Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The ideal candidate will have a computer science or MIS degree and 1-3 years of development experience.&amp;nbsp; The ideal candidate will have two or more the following abilities:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Solid command of OOP/OOD using C++, C#, Java or VB.NET&lt;/li&gt; &lt;li&gt;Test Driven Design&lt;/li&gt; &lt;li&gt;Service Oriented Architecture&lt;/li&gt; &lt;li&gt;Familiarity with MySql, Sql Server (T-SQL), Oracle (PL/SQL)&lt;/li&gt; &lt;li&gt;Basic understanding of both Winforms and ASP.NET&lt;/li&gt; &lt;li&gt;Basic familiarity with Web Services, MSMQ, Enterprise Services/COM+, .NET Remoting, DCOM, J2EE, Java Beans&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Just like the Junior development positions, these ones will provide a great deal of flexibility to learn and specialize the area of your choice.&amp;nbsp; These are considered &amp;#39;fast track&amp;#39; positions to move into the Senior Developer or Architect roles&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Senior Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The ideal candidate will be someone with at least 4 years experience.&amp;nbsp; This person will love challenges and love coming up with solutions to problems that other people run from.&amp;nbsp; They will be people that love figuring out how to do things that everyone else said can&amp;#39;t be done.&amp;nbsp; They will be the stereotypical Alpha-Geek, Someone that spends their spare time &lt;a href="http://newtechusa.com/csharp-dotnet-quiz.asp"&gt;answering quiz questions like these&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;All of the requirements for the Mid-Level Developer as well as several of the following skills:&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Proficiency with T-Sql or PL/SQL.&amp;nbsp; You should be able to write a 5 table join on your own. You should have written several stored procedures that were &amp;gt; 100 lines long.&lt;/li&gt; &lt;li&gt;Strong command of query tuning and ability to easily spot design flaws&lt;/li&gt; &lt;li&gt;Ability to design &amp;#39;real&amp;#39; objects.&amp;nbsp; &lt;/li&gt; &lt;ul&gt; &lt;li&gt;Someone who pays meticulous attention to the scope modifiers of their classes/functions/properties&lt;/li&gt; &lt;li&gt;Someone who understands the problems associated with coupling and strives to avoid it.&lt;/li&gt; &lt;li&gt;Someone who can write and use events in their classes without thinking twice about it.&lt;/li&gt; &lt;li&gt;Someone with a solid understanding of thread safety and thread synchronization&lt;/li&gt; &lt;li&gt;Someone who is comfortable using several different design patterns&lt;/li&gt; &lt;li&gt;Someone who is comfortable implementing several different interfaces in one object, using combinations of interface implementation and inheritance and someone who can use inheritance responsibly&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Keeps up with technology, reads computer books regularly, has favorite blogs in multiple disciplines and/or blogs themselves, attends or speaks at user&amp;#39;s groups, is active in one or more online forum or newsgroup&lt;/li&gt; &lt;li&gt;Someone who answers &amp;quot;Which is better, C# or VB.NET?&amp;quot; with &amp;quot;Either can be better depending on the circumstances but I&amp;#39;m comfortable writing in either of them&amp;quot; and then &amp;quot;But I&amp;#39;ve been learning F# lately and it&amp;#39;s really been growing on me&amp;quot;&lt;/li&gt; &lt;li&gt;Experience with .NET Remoting, Web Services &amp;amp; Web Services Enhancements, MSMQ, Enterprise Services and/or WCF&lt;/li&gt; &lt;li&gt;Ability to create syntactically correct UML diagrams (meaning they can do more than write the letters &amp;quot;UML&amp;quot; on their resume) and if not, they are willing to learn to do this.&lt;/li&gt; &lt;li&gt;Understands data structures solidly and could easily implement their own HashTable or LinkedList &lt;/li&gt; &lt;li&gt;Someone who&amp;#39;s always looking to come up with a newer, cooler, faster, and more secure way to do implement something&lt;/li&gt; &lt;li&gt;Experienced with either Biztalk server or Sharepoint&lt;/li&gt; &lt;li&gt;Takes pride in their code without falling in love with it or getting all defensive about it.&amp;nbsp; Ability to acknowledge the fact that everyone makes mistakes and can talk about their mistakes/bugs without getting defensive.&lt;/li&gt; &lt;li&gt;Someone who is the first to raise their hand whenever the boss says &amp;quot;I need someone to learn ____________, do I have any volunteers&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;Basically, if you love development, love creating new cutting edge solutions all the while making a lot of money and having a lot of fun you definitely should talk to these folks.&amp;nbsp; If you&amp;#39;re interested...... Please drop me a line using the Contact option on&amp;nbsp; my blog or emailing me directly at &lt;a href="mailto://WilliamRyan@gmail.com"&gt;WilliamRyan@gmail.com&lt;/a&gt; and I&amp;#39;ll put you in contact with them.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1632527" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Compact+Framework/default.aspx">Compact Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Web+Services+_2F00_+WSE/default.aspx">Web Services / WSE</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+Basics/default.aspx">.NET Basics</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Biztalk/default.aspx">Biztalk</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.0+Framework/default.aspx">.NET 3.0 Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WIX/default.aspx">WIX</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server+Integration+Services/default.aspx">Sql Server Integration Services</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server/default.aspx">Sql Server</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server+2008/default.aspx">Sql Server 2008</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sharepoint/default.aspx">Sharepoint</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/LINQ+To+ADO.NET/default.aspx">LINQ To ADO.NET</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.5+Framework/default.aspx">.NET 3.5 Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/LINQ+Training/default.aspx">LINQ Training</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/ADO.NET+3.5/default.aspx">ADO.NET 3.5</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/C_2300_+3.5/default.aspx">C# 3.5</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Windows+Mobile/default.aspx">Windows Mobile</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Job+Stuff/default.aspx">Job Stuff</category></item><item><title>The Microsoft® Windows Mobile Line of Business Solution Accelerator 2008!</title><link>http://msmvps.com/blogs/williamryan/archive/2008/03/17/the-microsoft-174-windows-mobile-line-of-business-solution-accelerator-2008.aspx</link><pubDate>Mon, 17 Mar 2008 13:04:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1545998</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=1545998</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=1545998</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2008/03/17/the-microsoft-174-windows-mobile-line-of-business-solution-accelerator-2008.aspx#comments</comments><description>&lt;p&gt;Rob Tiffany &lt;a href="http://blogs.msdn.com/robtiffany/archive/2008/03/15/a-great-spartan-once-said.aspx"&gt;has got the details...&lt;/a&gt;&amp;nbsp;.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;The main features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Intelligent resolution awareness&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Synchronization Services&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Windows Communication Foundations &amp;quot;Store and Forward&amp;quot;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;MapPoint&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;LINQ&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Custom Controls&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Managed Stored Procedures and Triggers&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Notifications and Online Help&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Language Switching and Localization&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Some of these (WCF, Synchronization Services) are a lot more thrilling than others but all in all it&amp;#39;s a great step forward.&amp;nbsp; With that said, I think MS really needs to work on a few things. When the iPhones first came out, I was lucky enough to have one sent to me.&amp;nbsp; I liked it but didn&amp;#39;t go gaga over it. After two days, I decided to sell it.&amp;nbsp; I think UI wise, it was far ahead of a typical SmartPhone although the PocketPC edition phones gave it a lot better run for the money.&amp;nbsp; But I know that my opinion is not typical. In fact, most iPhone users who have used or use Windows Mobile are really adamant about the superiority of the UI and usability.&amp;nbsp; I think some of that is b/c they are comparing a 500.00 phone with a much cheaper one in many cases but across the board, the iPhone does probably have the advantage.&amp;nbsp; Having started to toy with the iPhone SDK, I have to admit it&amp;#39;s fairly easy to pick up (nowhere near as easy as the Compact Framework) so once more applications come out for it, it will make it all the more attractive to mainstream users.&amp;nbsp; I have a lot of faith in Microsoft though and nothing would please me more than for Windows Mobile 7.0 to work so well that &lt;a href="http://blah.winsmarts.com/"&gt;my obnoxious iPhone owning friends&lt;/a&gt; will have to pipe down about the greatness of the iPhone.&amp;nbsp; The accelerator however, is definitely a step in the right direction.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1545998" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/News/default.aspx">News</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Humor/default.aspx">Humor</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/ADO.NET+Synchronization+Services/default.aspx">ADO.NET Synchronization Services</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Microsoft.Synchronization/default.aspx">Microsoft.Synchronization</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Mobility/default.aspx">Mobility</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Sahil+Malik/default.aspx">Sahil Malik</category></item><item><title>Whitney Weaver is now blogging</title><link>http://msmvps.com/blogs/williamryan/archive/2008/03/11/whitney-weaver-is-now-blogging.aspx</link><pubDate>Tue, 11 Mar 2008 21:38:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1540396</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=1540396</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=1540396</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2008/03/11/whitney-weaver-is-now-blogging.aspx#comments</comments><description>&lt;p&gt;My friend and co-worker,&lt;a href="http://blog.magenic.com/blogs/whitneyw/default.aspx"&gt;Whitney Weaver is now blogging&lt;/a&gt; at the &lt;a href="http://blog.magenic.com/blogs/"&gt;Magenic blog site&lt;/a&gt;. Actually, he&amp;#39;s been blogging for a little while now, I&amp;#39;ve just been a bum and not updated my blog in a while.&amp;nbsp; Although he&amp;#39;s certainly an up and coming programmer, Whit&amp;#39;s main area of expertise is data, so if you&amp;#39;re a data guy (or gal), you should &lt;a href="http://blog.magenic.com/blogs/whitneyw/default.aspx"&gt;check out his site&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1540396" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category></item><item><title>Coding Arguments - aka How to Start Religious Wars</title><link>http://msmvps.com/blogs/williamryan/archive/2007/07/23/coding-arguments-aka-how-to-start-religious-wars.aspx</link><pubDate>Mon, 23 Jul 2007 04:33:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1048055</guid><dc:creator>William</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=1048055</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=1048055</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2007/07/23/coding-arguments-aka-how-to-start-religious-wars.aspx#comments</comments><description>&lt;p&gt;I am lucky enough to work for a company that&amp;nbsp; really encourages us to get together and learn/hang out etc.&amp;nbsp; One way this happens is by Tech Nights. Basically, we have in office meetings which are recorded via Live Meeting, where someone picks a topic and teaches about it. Afterward, folks go to dinner and the company picks up the tab. Two weeks ago I had done the presentation and we all went out afterward.&amp;nbsp; Two of our new guys were with us, and the rest of the folks there had all worked together at a particular client.&amp;nbsp; Both of our new guys are really sharp, can talk their share of smack when necessary and been here long enough to feel comfortable speaking their minds if they want to.&lt;/p&gt;
&lt;p&gt;The first discussion was regarding&amp;nbsp;Frameworks.&amp;nbsp;&amp;nbsp;One of us mentioned that he liked Frameworks and believes in them.&amp;nbsp; Being the smart a55 that I am, I asked &amp;quot;What in the h3ll does that mean?&amp;quot;&amp;nbsp; .&amp;nbsp; He proceeded to explain that he believed in code reuse and has build reusable code&amp;nbsp;at every opportunity.&amp;nbsp; Trying to have a little fun and&amp;nbsp;encourage discussion, I asked him &amp;quot;Who doesn&amp;#39;t believe in code reuse?&amp;nbsp; But if that&amp;#39;s the only goal, then a function gets the job done.&amp;nbsp; Above functions, the whole reason for OOP&amp;nbsp;is to facilitate reuse and simply building&amp;nbsp;a bunch of objects that can be used sounds&amp;nbsp;a lot more like an API than a Framework&amp;quot;.&amp;nbsp; The guy in question is a top notch coder and certainly understands the difference, he&amp;nbsp;just had a little trouble using &amp;#39;official definitions&amp;#39;.&amp;nbsp; But&amp;nbsp;asking what differentiates a Framework from an API&amp;nbsp;turned out to be a pretty decent question to ask b/c neither have absolutely conclusive definitions that make them mutually exclusive.&amp;nbsp;As such, it&amp;#39;s precisely the type of argument that a bunch of nerds can argue into the ground over dinner.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;I mentioned before that&amp;nbsp;the &amp;#39;rest of us&amp;#39;&amp;nbsp;all worked at a certain client together.&amp;nbsp; Personally, I&amp;#39;m pretty fond of standardization when it comes to coding. So even if I think my way is better, I&amp;#39;ll&amp;nbsp;use the predominant methodology in most cases simply b/c I think that in general, any improvements that doing it &amp;#39;my&amp;#39; way brings will be more than offset by complications resulting from differing coding styles. If nothing else, it&amp;nbsp;will usually mean that every time someone looks at it, they are going to ask &amp;quot;Why is it like this instead of ...&amp;quot;.&amp;nbsp; It ends up causing you to explain it over and over and have pedantic&amp;nbsp;discussions with each new person that joins the team. Similarly, if you differ from what&amp;#39;s being done, it&amp;#39;s a virtual certainty that the implication of it will be that &amp;#39;the other way is wrong&amp;#39;.&amp;nbsp;Most of the folks I work/worked with are humble enough to acknolwedge that&amp;nbsp;any given way they chose to implement something could have been better (any *real* coder will always acknolwedge it could have been done better. Anyone that says it couldn&amp;#39;t is&amp;nbsp;either egotistical or clueless).&amp;nbsp; However, just because people are ok with admitting they didn&amp;#39;t chose an optimal design methodology, that doesn&amp;#39;t mean it&amp;#39;s cool to rub it in their face.&amp;nbsp; After all, you&amp;#39;ll be on that side of the equation unless you never have to design stuff.&amp;nbsp; Not that I recommend doing things&amp;nbsp;wrong just to save people&amp;#39;s egos, but some times,&amp;nbsp;it&amp;#39;s&amp;nbsp;too easy to get&amp;nbsp;so carried&amp;nbsp;away with saying &amp;quot;this is right&amp;quot; or&amp;nbsp;&amp;quot;this is wrong&amp;#39; that you forget to remember&amp;nbsp; &amp;quot;It needs done&amp;quot;. Another problem with doing things differently is that opinions are like Carrolls, everyone has one.&amp;nbsp; What seems&amp;nbsp;obvious as day to one person may seem utterly silly to another.&amp;nbsp;&amp;nbsp;Design decisions are all about tradeoffs and since we all see the value of tradeoffs differently, well you know...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Since a few of us worked at the same client, I decided to provoke a little bit.&amp;nbsp; We had worked there at different times, except for me - I was there throughout the time each of&amp;nbsp;the other guys was there. So one of them had really strong opinions about how well code should be formatted.&amp;nbsp;&amp;nbsp;So on the one side we had the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Upper case for Keywords and reserved words&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Commas at the beginning of the line&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Each column on a different line&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Lining up words in the center&lt;/div&gt;&lt;code&gt;UPDATE Whatever &lt;br /&gt;&amp;nbsp;&amp;nbsp; SET Whatever &lt;br /&gt;&amp;nbsp;WHERE WHATEVER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Immediately getting rid of any objects that aren&amp;#39;t used or that were just used for testing&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Using Source Control to track versioning differences.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Death to Hungarian Notation&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Names should be self documenting - no acronyms, developer initials or anything that might lead to confusion about what the method should do.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Only including update information in the procedure&amp;#39;s/parameter&amp;#39;s&amp;nbsp; documentation and leaving big changes to the source control system.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Since we didn&amp;#39;t have a Source control system at the client (their choice not ours), part of this reasoning was problematic and I&amp;#39;m probably leaving a few things out,but overall, this characterizes Argument 1.&lt;/p&gt;
&lt;p&gt;Argument 2 on the other hand was&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Document everything in the&amp;nbsp; procedure.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Have a dated comment showing who made the change every single time anything was changed&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Leave backups and test objects in the database because they may be needed later&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Minimal attention to formatting (although each person that advocated this was very careful about how their code performed. So it&amp;nbsp; would be totally unfair to imply their work was sloppy - they just had more of a don&amp;#39;t sweat the small stuff but make really sure the big stuff is right approach&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Use initials for personal utility procedures so they can be found and used easily.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Personally, I am a nut about formatting. I&amp;#39;m really fastidious about formatting and would clearly rather have NO comments than out of date comments or too many comments - but that&amp;#39;s not to say that I am anti-comments in any sense. I also am pretty fussy about source control, if you are going to have any configuration management, I can&amp;#39;t stand it being done in comments inline or at the top of the code - it needs to be in a version control system.&amp;nbsp; So on this one, the people that were on the project who preferred Argument 1 were in the minority. However at the table, we were in the Majority.&amp;nbsp; This immediately led to a small trash talking session among friends.&amp;nbsp; Little did we know the new guys were so interested in the topic. One of them seemed to be pretty opinionated but it wasn&amp;#39;t until a week later that we realized how much so.&lt;/p&gt;
&lt;p&gt;The thing is that while I consider myself a Data guy, my theoretical understanding of Relational Database theory is much stronger than say my DBA skills are. And although I&amp;#39;m admittedly a little fussy about formatting and the like, I have to admit that many of the best DBA&amp;#39;s I&amp;#39;ve worked with are much more relaxed about formatting and commenting than I am. Many of them not being AppDev guys don&amp;#39;t depend on Source Control and prefer to handle versioning issues inline. It&amp;#39;s difficult to argue against competency so in the end, my utimate belief is to defer to the best guy on the project.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Have you encountered any discussions like this that you didn&amp;#39;t really think would get people talking much but ended up getting people really involved?&amp;nbsp; Personally, I think that as long as you&amp;#39;re dealing with mature professionals, these sorts of things are great b/c folks are passionate about them, so you have smart people putting forth their best arguments, and you can&amp;#39;t help but gain perspective and knowledge. On the other hand, if you deal with people who get defensive easy, or who have trouble admitting they don&amp;#39;t know everything (funny how the more defensive they are , the less they actually know in most cases), well, this stuff will do nothing but cause bad blood.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;So which side do you fall on?&amp;nbsp; I&amp;#39;m guessing it&amp;#39;s not this black and white in many cases, for instance, the comma issue could fall in either group.&lt;/p&gt;
&lt;p&gt;What sorts of things have you come across that have stirred discussion? Any specific coding arguments, and if so, what?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1048055" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Life+in+General/default.aspx">Life in General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>ADO.NET Synchronization Services</title><link>http://msmvps.com/blogs/williamryan/archive/2007/01/26/ado-net-synchronization-services.aspx</link><pubDate>Fri, 26 Jan 2007 15:10:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:521269</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=521269</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=521269</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2007/01/26/ado-net-synchronization-services.aspx#comments</comments><description>So little time, so much &lt;A href="http://blogs.msdn.com/synchronizer/archive/2007/01/25/offline-application-demo-i.aspx"&gt;cool new technology to play with&lt;/A&gt;&amp;nbsp;.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=521269" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/ADO.NET+Synchronization+Services/default.aspx">ADO.NET Synchronization Services</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+Orcas/default.aspx">Visual Studio .NET Orcas</category></item><item><title>My Update isn't working...</title><link>http://msmvps.com/blogs/williamryan/archive/2007/01/25/my-update-isn-t-working.aspx</link><pubDate>Thu, 25 Jan 2007 05:07:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:517677</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=517677</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=517677</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2007/01/25/my-update-isn-t-working.aspx#comments</comments><description>&lt;P&gt;A while ago, I used to answer so many "My update isn't working. It doesn't throw exceptions but it doesn't do anything" type questions that I wrote &lt;A href="http://www.knowdotnet.com/articles/efficient_pt4.html"&gt;this article&lt;/A&gt;&amp;nbsp;.&amp;nbsp; Those days seem long removed, or at least they did.&amp;nbsp; Seems the problem is creeping back up with Tableadapters. In fact, one of the most common questions I'm seeing in some of the forums is "TableAdapter", "Access" "Not Updating" or some combination thereof.&amp;nbsp; Now my 'real' answer is "Don't use TableAdapters and Don't use Access - and read my article.&amp;nbsp; So other than the fact that TableAdapters are kind of lame, I wonder why they are causing so many problems.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=517677" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category></item><item><title>Musings on the database formerly known as Sql Everywhere</title><link>http://msmvps.com/blogs/williamryan/archive/2006/11/02/Musings-on-the-database-formerly-known-as-Sql-Everywhere.aspx</link><pubDate>Thu, 02 Nov 2006 01:53:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:237552</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=237552</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=237552</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/11/02/Musings-on-the-database-formerly-known-as-Sql-Everywhere.aspx#comments</comments><description>&lt;p&gt;The IM volume I received today about the &lt;a href="http://blogs.msdn.com/stevelasker/archive/2006/10/31/sql-server-everywhere-gets-yet-another-name.aspx"&gt;Rollback to SqlCE&lt;/a&gt;&amp;nbsp;issue was enough to border on overwhelming.&amp;nbsp; Between PMs and some lazy SOB CRM guy trying to get me to do all his work for him, it was hard focusing on work today. (And seriously, if you are a CRM professional, telling me you don&amp;#39;t know how to do a two table, one field inner join so i have to do it for you, makes you look like a Complete Moron.&amp;nbsp; Try &amp;#39;Bill, I&amp;#39;m really busy, can you do me a favor and write this join for me&amp;#39; next time, at least then my gag reflex won&amp;#39;t kick in).&amp;nbsp; But I digress.&lt;/p&gt;&lt;p&gt;Anyway, I&amp;#39;ve been getting a lot of email about my presentations on Everywhere.&amp;nbsp; I guess I got people thinking about a few assertions I&amp;#39;ve made.&amp;nbsp; In a nutshell, I made the following comments:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I love ADO.NET and in no way am I disparaging it, but in some scenarios, the disconnected model just doesn&amp;#39;t fit.&amp;nbsp; This has nothing to do with any deficiency in theory or implementation of ADO.NET.&amp;nbsp; A Ferrari is a great vehicle but if you need to tow a heavy boat, it&amp;#39;s not the right vehicle.&lt;/li&gt;&lt;li&gt;The one case where I don&amp;#39;t think the ADO.NET architectue is well suited to handle is single user scenarios where you are *positive* that you&amp;#39;ll only have one user connecting to your database.&lt;/li&gt;&lt;li&gt;Devices like Smartphones and PDAs proabably aren&amp;#39;t going to be targeting multiple users simultaneously and in those cases, where you are resource constrained and pretty much assured of a single user, the database-&amp;gt;dataset model is overly consumptive.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In case you don&amp;#39;t understand why, let me explain.&amp;nbsp; What does using a disconnected model bring to the table?&amp;nbsp; Essentially it brings tremendous scability and at least as far as the server is concerned, the possiblity of improved performance.&amp;nbsp; It is a Just In Time data access strategy that can greatly minimize locking and bottlenecks.&amp;nbsp; Like anything, it needs to be used wisely but the fact you don&amp;#39;t have to keep a persisent connection to the db is huge.&amp;nbsp; This benefit isn&amp;#39;t free.&amp;nbsp; In exchange for it you have to pay a price in RAM b/c you&amp;#39;re using cached copy of the data.&amp;nbsp; In most cases, this tradeoff is well worth it.&amp;nbsp; In some though, it makes very little sense.&amp;nbsp; Think of a Smartphone.&amp;nbsp; I have one user.&amp;nbsp; Only one person needs to be hitting the db at once.&amp;nbsp; I have the data persisted to disk and I have limited RAM.&amp;nbsp; What benefit does sticking a dataset in between my UI and the backend db bring?&amp;nbsp; None.&lt;/p&gt;&lt;p&gt;That&amp;#39;s where the beauty of using SqlCE/SqlMobile/SqlEverywhere/SqlCE comes in.&amp;nbsp; You can use the SqlCeResultset which is scrollable and updateable, and you can cut out the layer in the middle.&amp;nbsp; Your logic is trimmed down b/c updates/inserts/deletes require no work on your part provided the table you&amp;#39;re hitting is keyed.&lt;/p&gt;&lt;p&gt;But that has a problem.&amp;nbsp; What if the data needs synchronized with a db server?&amp;nbsp; Well, you can roll your own logic.&amp;nbsp; Or you can use a familiar, well documented, well tested and peer reviewed mechanism.&amp;nbsp; Unless you&amp;#39;re getting paid by the hour and you have no compunction about robbing from your clients, use the latter.&lt;/p&gt;&lt;p&gt;So in short, on a SmartPhone or PDA, SqlCe/SqlMobile/SqlEverywhere/SqlCe is a seemlingly perfect solution for data access. Now that you can run it on a desktop, the same holds for single user scenarios there.&amp;nbsp; And using a SqlCeResultset&amp;nbsp;is *not* a replacement for ADO.NET.&amp;nbsp; It&amp;#39;s still ADO.NET in every sense of the word, it&amp;#39;s just a evolution of one aspect of it. And a darned good on for single user scenarios.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=237552" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Compact+Framework/default.aspx">Compact Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>A mobile database by any other name...</title><link>http://msmvps.com/blogs/williamryan/archive/2006/11/01/A-mobile-database-by-any-other-name_2E00__2E00__2E00_.aspx</link><pubDate>Wed, 01 Nov 2006 01:01:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:234065</guid><dc:creator>William</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=234065</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=234065</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/11/01/A-mobile-database-by-any-other-name_2E00__2E00__2E00_.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m really torn about this post.&amp;nbsp; On the one hand Microsoft has repeated one of their most annoying feats.&amp;nbsp; However they did it with a product that I love, so I feel a little bad dogging it out.&amp;nbsp;&amp;nbsp; What am I talking about?&amp;nbsp; &lt;a href="http://blogs.msdn.com/stevelasker/archive/2006/10/31/sql-server-everywhere-gets-yet-another-name.aspx"&gt;They renamed that little database that can run on your phone again!&lt;/a&gt;&amp;nbsp; So first it was SqlCe, then it was Sql Mobile, then it was Sql Everywhere, now it&amp;#39;s SqlCe with an emphasis on the fact that CE stands for Compact Edition.&amp;nbsp;&amp;nbsp;I&amp;#39;ll stop&amp;nbsp;now&amp;nbsp;before I stick my foot in my mouth ;-)&amp;nbsp; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=234065" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Compact+Framework/default.aspx">Compact Framework</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category></item><item><title>Differentiating between "Denormalization" and excuse making.</title><link>http://msmvps.com/blogs/williamryan/archive/2006/09/27/Differentiating-between-_2200_Denormalization_2200_-and-excuse-making_2E00_.aspx</link><pubDate>Wed, 27 Sep 2006 05:47:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:142646</guid><dc:creator>William</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=142646</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=142646</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/09/27/Differentiating-between-_2200_Denormalization_2200_-and-excuse-making_2E00_.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve actually got a lot to discuss about database stuff but wanted to start out explaining a very basic concept.&amp;nbsp;&amp;nbsp; All me to disgress for a moment.&amp;nbsp; I&amp;#39;ve worked at a few places where there were some Cobol/AS 400 developers that were quite full of themselves. They knew how to handle business with COBOL/AS400 and it went straight to their heads.&amp;nbsp; Along came round wheels, indoor plumbing, relational databases and object oreinted programming and they dismissed it as a fad.&amp;nbsp; Then as reality repeatedly *** slapped them, they just turned into eternal pity parties lamenting how all the good jobs are moving to India and how relational databases suck.&amp;nbsp; And as is often the case with people that think Relational Databases suck, they were heavy on opinion but really light on reasons to back it up.&amp;nbsp; There was a perfect correlation between the degree to which they thought RDBMS&amp;#39;s sucked and their lack of knowledge about them. How you can know something is lame without knowing anything about it [with repsect to technology] is beyond me.&amp;nbsp; Sure, I can know that drinking out of a Port-O-Potty sucks without doing it, but I at least have to know what&amp;#39;s in a Port-O-Potty to understand why drinking from it would suck.&lt;/p&gt;&lt;p&gt;So their criticisms came down to two things for the most part.&amp;nbsp; First they claimed that joins had too much overhead.&amp;nbsp; Next they claimed that Normalization was unnecessary and that in many cases, it was impossible to do.&amp;nbsp; Back when I had my Apple 2e, perhaps joins would be too expensive.&amp;nbsp; But in and of itself, it&amp;#39;s a lame argument. [I won&amp;#39;t even touch the fact that many of their Killer AS400 apps used to take 20 minutes to run even the simplest of queries].&amp;nbsp; And they would build in redundancies everywhere.&amp;nbsp; They must have all surfed the internet long and hard for &amp;quot;Lame excuses to use when you get busted creating a really crappy db structure&amp;quot; and somewhere stumbled across the word &lt;a href="http://en.wikipedia.org/wiki/Denormalization"&gt;http://en.wikipedia.org/wiki/Denormalization&lt;/a&gt;&amp;nbsp;because that was their excuse for everything.&amp;nbsp; One manager who fancied himself an architect was addicted to redundancies.&amp;nbsp; He actually lamented the fact that the tool we were using only allowed 250 columns and we had *many* tables that used every last one.&amp;nbsp; When the chickens came home to roost he decided he needed a good excuse. The president of the company decided to circumvent him and went to each of the developers asking why we were having all the problems we were experiencing.&amp;nbsp; And everyone that wasn&amp;#39;t a COBOL programmer who refused to change said that same thing - redundancies.&amp;nbsp; He was in a bind.&amp;nbsp; Then he called a meeting, with the president, and had a bunch of printouts about Denormalization and how that&amp;#39;s the approach he used.&amp;nbsp; &lt;/p&gt;&lt;p&gt;So people that don&amp;#39;t know what they are talking&amp;nbsp; about often use Denormalization and redundancy synonomously.&amp;nbsp; The metaphor that comes to mind is this... If you fill your bathtub up with hot water, then find it&amp;#39;s too hot and proceed to turn on the cold water until it becomes tolerable, that&amp;#39;s not the same as never turning on the hot water in the first place.&lt;/p&gt;&lt;p&gt;This silly excuse usually shows itself with &amp;#39;Historical&amp;#39; data, they&amp;#39;ll claim they built in the redundancies to handle historical data.&amp;nbsp; If you had a customers table with a SalesPersonID which relates to a name, they&amp;#39;ll point out that if you change the name of the sales person, you&amp;#39;ll affect all the records.&amp;nbsp; This issue can usually be worked out with effective dates but that&amp;#39;s another story.&amp;nbsp; So I&amp;#39;ll concede, the historical data issue is a valid place to have redundancies.&amp;nbsp; However, and this is a big howerver!!!!!, it&amp;#39;s only valid if the historical data is not to be changed in the future.&amp;nbsp; If it&amp;#39;s data that you might have to change or update, then the redundancies are just that, redundancies.&amp;nbsp; And you can still use historical data and use relational modelling. If you have the SalesPersonID and Name in the Historical table, and you have cause to update it because of business requirements, it&amp;#39;s not &amp;#39;denormalization&amp;#39; and it&amp;#39;s a bad way to do things.&amp;nbsp; &lt;/p&gt;&lt;p&gt;You may think this is so obvious that it goes without saying. However&amp;nbsp;I was in a situation not too long ago where a database was created that had redundancies All over the place.&amp;nbsp; If you needed to change a Salesperson&amp;#39;s name (for instance, someone gets married), you had to go into at least 12 different tables to change it. And if you missed one record, it was enough to seriously screw up the logic reporting was built on.&amp;nbsp; Another wonderful feature was computed fields stored as hard coded values.&amp;nbsp; Every week a new series of transactions would be imported.&amp;nbsp; A few processes were run and the aggregate total of sales, fees etc were stored in multiple tables.&amp;nbsp; Then the details that were used to create them were stored in another series of tables.&amp;nbsp; If you changed data in one place and didn&amp;#39;t change it everywhere else, reporting would be totally hosed.&amp;nbsp; To say it was a nightmare to maintain would be putting it mildly. Yet the person that built this system claimed that it was done intentionally as a means to double check the values.&amp;nbsp; So let me ask you this.&amp;nbsp; If you have a&amp;nbsp; table with CustomerID, Sales, Week, and you run a process to stick the aggregate of sales in one table, how is that any different than just using SUM?&amp;nbsp; Rather, how can you claim it&amp;#39;s &amp;#39;better&amp;#39; or intentional?&amp;nbsp; People like this often rationalize it with &amp;quot;Well if everyone did their job and just made sure they updated all the tables, there wouldn&amp;#39;t be a problem.&amp;#39;&amp;nbsp; True enough.&amp;nbsp; But people make mistakes.&amp;nbsp; If you can&amp;#39;t force all the other changes to occur each time source data changes through triggers or integrity constraints, you can&amp;#39;t guarantee changes will be made. Plain and simple.&lt;/p&gt;&lt;p&gt;When you see a nightmare database or program, it&amp;#39;s often attributed to the ignorance of the person that created it.&amp;nbsp; But pure ignorance will typically only produce bad stuff, not truly terrible stuff. To be truly terrible, it takes someone who&amp;#39;s convinced their way is best, while being totally ignorant of the consequences.&amp;nbsp; You can only make something so bad accidentally.&amp;nbsp; No, the really horrendous things out there are always the result of deliberate action by someone or some group of people. And this begs the bigger question - why, in 2006, with all the books out there, internet sites etc, so people still fight normalization when using Relational Database Systems?&amp;nbsp; And why or why do people that have no clue what they are doing and little to no desire to learn get to design critical systems?&lt;/p&gt;&lt;p&gt;I&amp;#39;m betting this is more common than it may seem.&amp;nbsp; Anyone else still run into stuff like this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=142646" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>Comment of the week - Sql Server Reporting Services vs. Crystal</title><link>http://msmvps.com/blogs/williamryan/archive/2006/09/27/Comment-of-the-week-_2D00_-Sql-Server-Reporting-Services-vs.-Crystal.aspx</link><pubDate>Wed, 27 Sep 2006 05:27:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:142621</guid><dc:creator>William</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=142621</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=142621</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/09/27/Comment-of-the-week-_2D00_-Sql-Server-Reporting-Services-vs.-Crystal.aspx#comments</comments><description>&lt;p&gt;A while ago, I posted &lt;a href="http://msmvps.com/blogs/williamryan/archive/2004/11/07/18148.aspx?CommentPosted=true#commentmessage"&gt;this&lt;/a&gt;&amp;nbsp;about how much a55 I think Crystal Reports sucks.&amp;nbsp; A long time ago, back at like v.7, I thought Crystal was a decent product.&amp;nbsp; And to be honest, it still is a decent product.&amp;nbsp; But it comes with a lot of baggage and has a lot that just makes it lame.&amp;nbsp; So I had almost total consenus on the Crystal Reports w/ .NET sucks side, I think there are two people that disagree.&amp;nbsp;Ignoring the fact that SSRS is very new product and Crystal has been around forever, I think side by side it&amp;#39;s a slam dunk.&amp;nbsp; But one big mouth said this: (NOTE:&amp;nbsp; I&amp;#39;m only posting a comment that was publicly posted on my site.&amp;nbsp; So hopefully the guy won&amp;#39;t be a &lt;a href="http://www.charlescarroll.com"&gt;cry baby&lt;/a&gt; about it and throw a temper tantrum over it)&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;quot;Either you guys are idiots or you have never used Crystal and don&amp;#39;t realize the minimal functionality that SQL Reporting Services offers. I have spent the last week evaluating SSRS and am greatly dissapointed. I came up with a list of over 250 items that SSRS could not do. As for all you Access reporters, your probably the only people to ever purchase Microsoft&amp;#39;s &amp;quot;Bob&amp;quot; product. &amp;quot;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;So the guy claims to know enough about Crystal to have cataloged over 250 features that SSRS doesn&amp;#39;t have.&amp;nbsp; That means that including the features he&amp;#39;ll admit it does have, he knows way more than 250 features.&amp;nbsp; I think that would qualify you as a fairly advanced Crystal user if you&amp;#39;ll pardon the oxymoron.&amp;nbsp; And he spent one week with SSRS.&amp;nbsp; And the only conclusion he can draw is that SSRS is definitely lacking those features and that it couldn&amp;#39;t possibly be that he just doesn&amp;#39;t know how to use them, right?&amp;nbsp; And far be it from me to say anything positive about Access, but come on, being a hard core Crystal user still means you&amp;#39;re the report ***, and that gives you credentials to snob no one. Certainly not Access developers&amp;nbsp;and certainly not Bob users.&amp;nbsp; Is he really claiming Bob was lame but Crystal Reports isn&amp;#39;t?&amp;nbsp; Pulllleeezz.&amp;nbsp; But if you read the context of the comments, the people were pointing out that Access, as lame as it is, provides more effective funcionality.&amp;nbsp; The fact this can even be debated speaks volumes don&amp;#39;t you think?&amp;nbsp; Is Access supposed to be first and foremost a report writer?&amp;nbsp; Last time I looked it&amp;#39;s main purpose was as a relational database (more precisely, a database that anyone can build with, that causes major headaches for the people that will inevitably be brought in to clean up the mess it made) not a report writer.&amp;nbsp; Reports are one of its features but one would certainly expect that a mature product who&amp;#39;s sole purpose is report writing ought to be a little better than a RDBMS product with reports added in.&lt;/p&gt;&lt;p&gt;So I offered a challenge, I asked him to post just 20 of his 250 features that CR can do that SSRS can&amp;#39;t.&amp;nbsp; I&amp;#39;ll see if they really can&amp;#39;t be done and post the results. If I&amp;#39;m wrong, I&amp;#39;ll admit it.&amp;nbsp; If he&amp;#39;s wrong I&amp;#39;ll point out what an a33hat he is.&amp;nbsp; I actually believe there are probably 20 or so features missing, but certainly not major ones.&amp;nbsp; Even assuming there were really 250 features missing, how many times do you need 250 features for a report?&amp;nbsp; Typically you need Grouping, Subreporting, charts/graphs, conditional formatting, functions and the like. He didn&amp;#39;t comment as to his evaluation of how each stacked up there - for reasons that are obvious.&amp;nbsp; Anyway, I believe his 250+ number about as much as I believe in the easter bunny so although *someone* could probably post 20 things lacking, I doubt he can.&amp;nbsp; One of us is very wrong here and hopefully it&amp;#39;s not me. We&amp;#39;ll have to wait and see.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=142621" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Humor/default.aspx">Humor</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Mindless+Babbling/default.aspx">Mindless Babbling</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category></item><item><title>Normalization really does matter</title><link>http://msmvps.com/blogs/williamryan/archive/2006/09/07/Normalization-really-does-matter.aspx</link><pubDate>Thu, 07 Sep 2006 14:30:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:116352</guid><dc:creator>William</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=116352</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=116352</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/09/07/Normalization-really-does-matter.aspx#comments</comments><description>&lt;p&gt;It seems like years ago, but I remember one of my professors giving us an assignment. It involved taking a database chock full of redundancies and writing the SQL Statements to make a few small updates.&amp;nbsp; We thought it was an assignment to test our SQL Skills.&amp;nbsp; However we were graded on how close to &amp;#39;right&amp;#39; we got all of the changes.&amp;nbsp; It wasn&amp;#39;t about SQL at all, he could care less about SQL at this point. It was about illustrating, with much painful monotony, why &amp;quot;Normalization matters.&amp;quot;&lt;/p&gt;&lt;p&gt;After we turned the assignment in, he asked everyone how long it took.&amp;nbsp; Suffice to say it took everyone a long time.&amp;nbsp; But the interesting thing was that not one single person got all of the changes correct. Many got close, but no one got all of them.&lt;/p&gt;&lt;p&gt;Then he explained some more why normalization matters.&amp;nbsp; You see, not only did working with non-normalized data (as opposed to denormalized) take forever to do, it was very error prone.&amp;nbsp; No matter how careful you are, if you do the same thing over and over, you&amp;#39;re likely to miss something.&lt;/p&gt;&lt;p&gt;Afterward, he proceeded to give us a story from the &amp;#39;real world&amp;#39;.&amp;nbsp; He told us how some things in CS have great theoretical value but not much practical value.&amp;nbsp; But he said that in general, good theory makes for good practice and no where is this more true than in DB Design.&amp;nbsp; We were told that when we get out into the real world, we&amp;#39;ll hear all sorts of &amp;#39;Senior&amp;#39; folks trashing normalization as ivory tower stuff that works great in college but doesn&amp;#39;t have value in the real world.&amp;nbsp; He said that *when* we hear this, to immediately ask the person &amp;quot;At which level doesn&amp;#39;t normalization make sense in the &amp;#39;real world&amp;#39;?&amp;nbsp; All of them or just certain forms&amp;quot;&amp;nbsp; This was because, in his opinion, the only people that will trash normalization are ones who don&amp;#39;t understand it.&amp;nbsp; Granted, there were many caveats in the lectures.&amp;nbsp; Sometimes it&amp;#39;s best to denormalize (which, is something you do AFTER you&amp;#39;ve normalized - for the uninitiated).&amp;nbsp; Many will design garbage and when the redundancies are pointed out will say &amp;quot;I totally do believe in normalization but I denormalized the design&amp;quot;.&amp;nbsp; If it wasn&amp;#39;t normalized in the first place it couldn&amp;#39;t have been denormalized, such statements are mere excuse making.&amp;nbsp; He also pointed out that sometimes when time is of the essense and maintainability isn&amp;#39;t a real issue, then normalization may not justify the costs.&amp;nbsp; There were definitely exceptions to his rule, but one thing that always stuck with me was that folks that trash normalization almost always have never studied it very far.&lt;/p&gt;&lt;p&gt;So why am I babbling about this?&amp;nbsp; It&amp;#39;s simple.&amp;nbsp; Some things can be totally screwed up and then fixed quickly/easily/inexpensively.&amp;nbsp; I could get the color scheme of a CSS layout totally upside down and fix it pretty quickly in many cases.&amp;nbsp;Other things are a little more difficult but still doable.&amp;nbsp; Let&amp;#39;s say I didn&amp;#39;t use inheritance and coded some total redundant classes.&amp;nbsp; Making the code modification won&amp;#39;t be trivial but if my code is modular, it should be fairly straightforward considering the development tools in place these days.&amp;nbsp; Other things though are deal breakers.&amp;nbsp; Absolute and utter deal breakers.&amp;nbsp; Database design is the epitome of a deal breaker.&amp;nbsp; To those new to development, you may be asking why DB Design is so vastly different from other design issues.&lt;/p&gt;&lt;p&gt;Just imagine the following scenario.&amp;nbsp; You have a Dog and a Cat class and they are in a running production app that&amp;#39;s working great. You decide that you should have had a Mammal base class and decided to implement it.&amp;nbsp; You guess it&amp;#39;ll take you about 16 hours to find every instance and make the appropriate changes.&amp;nbsp; So the app runs along, users are happy, you take your 16 hours, make your changes , test them (or test them, make them for many) and redeploy.&amp;nbsp; No problems. Users are none the wiser and everyone&amp;#39;s happy.&lt;/p&gt;&lt;p&gt;Now what if this was a production database?&amp;nbsp; Well, if you have downtime on the db then you can create a replica of the data, make your changes, verify they worked correctly and then implement them at some time when no one is using the system.&amp;nbsp; I&amp;#39;ve only worked in two places where such was the case.&amp;nbsp; If the design flaws go out the door on a live system, you&amp;#39;re stuck.&lt;/p&gt;&lt;p&gt;In the Dog Cat example, if you totally screwed something up, you can redeploy the previous version and in many cases it won&amp;#39;t be too big of a deal (in some it obviously will but that&amp;#39;s related to installation more than anything else).&amp;nbsp; But what if you damaged a lot of data, the impact very well may (and probably will) be immediate.&amp;nbsp; Moreoever, you are probably dealing with a moving target b/c the data is constantly changing. Even if you think you coded everythign correctly, new data may be introduced that you weren&amp;#39;t counting on. And even then, even assuming you got everything right, many changes of this sort are going to cause service interruptions.&amp;nbsp; Depending on what the db is used for, this could be a huge deal.&lt;/p&gt;&lt;p&gt;We all know that the further downstream it is that a bug is caught the more it costs to correct. We&amp;#39;ve all seen the upward trending curve.&amp;nbsp; The thing is that in most case, with DB changes in a production system, that curve is very short and very steep.&amp;nbsp; And if you do any of the following, you should be flogged:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use Reserved words as object names, column names etc (they are called Reserved words for a reason)&lt;/li&gt;&lt;li&gt;Use inconsistent naming conventions&lt;/li&gt;&lt;li&gt;Use unintelligible naming conventions&lt;/li&gt;&lt;li&gt;Ignore data types.&amp;nbsp; NVARCHAR isn&amp;#39;t the solution to everything. Yes, I know you can cast dates held in VARCHAR fields to DATETIME Values but that&amp;#39;s irrelevant&lt;/li&gt;&lt;li&gt;Fail to use keys. At a minimum you&amp;#39;re going to have a lot of trouble getting tools to update data but that&amp;#39;s the least of your worries&lt;/li&gt;&lt;li&gt;Use multiple fields to represent similar data and then using inconsistent rules for maintaining the data that they are populated with&lt;/li&gt;&lt;li&gt;Fail to enable integrity constraints. I once heard a developer, with a straight face, say he didn&amp;#39;t believe in integrity contsraints b/c he was a &amp;#39;real developer&amp;#39; and preferred to write his own.&amp;nbsp; He contended that he wanted to make sure things were done right as opposed to being lazy and leaving it to Oracle to handle.&amp;nbsp; You have to have the initials CC or have forgotten to take your lithium if you think you&amp;#39;re going to do a better job writing your own integrity constraints than Oracle/Microsoft etc are.&amp;nbsp; And for those of you that are going to get all pedantic and tell me of some obscure bug or situation where MS&amp;#39;s or Oracle&amp;#39;s constraints fail, I&amp;#39;d counter with this.&amp;nbsp; Use their AND use your own.&amp;nbsp; You can&amp;#39;t guarantee that they only way the data will be accessed is through your killer app and it&amp;#39;s uber integrity algorithms. So why leave it bare?&amp;nbsp; If you&amp;#39;re constraints are really that good, then it shouldn&amp;#39;t ever be an issue anyway right?&lt;/li&gt;&lt;li&gt;Freestyling!&amp;nbsp; Freestyling is cool as long as it&amp;#39;s done in a Rap/BMX/Skateboard etc context.&amp;nbsp; It has no place in the development world other than in R &amp;amp; D scenarios.&amp;nbsp; RDBMS systems are well tested and rooted in very strong theoretical foundations.&amp;nbsp; They have stood the test of time and they work.&amp;nbsp; They aren&amp;#39;t perfect but they are damn good and they work well when used correctly.&amp;nbsp; Unless you really are a super genius, chances are that you&amp;#39;re not going to have some superior way of doing things that the rest of the world has missed. And even if you did&amp;nbsp; find one, the chances of you finding another one are slim to none.&amp;nbsp; And why do these folks never seem to&amp;nbsp;freestyle with other things like addition, subtraction, multiplication, division, gravity, intertia etc?&amp;nbsp; What do you think would happen if you owed the IRS 10k and used your own math to compute that they actually owed you 10k?&amp;nbsp; Why would it be any different with anything else?&amp;nbsp;So if you&amp;#39;re some Maverick has a ton of &amp;#39;unique&amp;#39; ways of building your dbs - all you&amp;#39;re doing is shoving the burden of your sloppiness onto someone else.&lt;/li&gt;&lt;li&gt;Failing to at a minimum follow the first two normal forms.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It&amp;#39;s a matter of &amp;quot;you can get with the program or you can pay a ton of money to have someone else fix it, or spend a ton of time down the road fixing it yourself.&amp;quot;&amp;nbsp; And if this happens, you can&amp;#39;t cry foul - you&amp;#39;re the one that decided to break the rules.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=116352" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>Transferring data around with ADO.NET 2.0 - SqlBulkCopy</title><link>http://msmvps.com/blogs/williamryan/archive/2006/08/26/109836.aspx</link><pubDate>Sat, 26 Aug 2006 16:03:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:109836</guid><dc:creator>William</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=109836</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=109836</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/08/26/109836.aspx#comments</comments><description>I'm working at a client on a data migration and found some results that were surprising. I expected there to be a difference but not one quite this large... Synopsis of Problem: Right now I'm working on a rather complex migration from a bunch of disparate...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/08/26/109836.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=109836" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>To use Stored Procedures or not.</title><link>http://msmvps.com/blogs/williamryan/archive/2006/06/14/101183.aspx</link><pubDate>Wed, 14 Jun 2006 20:14:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:101183</guid><dc:creator>William</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=101183</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=101183</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/06/14/101183.aspx#comments</comments><description>A while ago, Frans wrote Stored Procedures are Bad, M'Kay . None other than Adam Machanic chimed in, arguing essentially the opposite . The always insightful Anatoly Lubarsky gives his take on it and well, my head is spinning. I was Mr. Stored Procedure...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/06/14/101183.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=101183" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>Where's the Extra Connection String Coming From?</title><link>http://msmvps.com/blogs/williamryan/archive/2006/06/14/101107.aspx</link><pubDate>Wed, 14 Jun 2006 00:33:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:101107</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=101107</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=101107</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/06/14/101107.aspx#comments</comments><description>One of the issues I came across when writing my new book was with ConnectionStrings. Examine the following configuration section: &amp;lt;connectionStrings&amp;gt; &amp;lt;add name="AdventureWorksString" providerName="System.Data.SqlClient" connectionString="Data...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/06/14/101107.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=101107" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>Pablo Castro on ADO.NET 3.0</title><link>http://msmvps.com/blogs/williamryan/archive/2006/06/12/100929.aspx</link><pubDate>Mon, 12 Jun 2006 22:39:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:100929</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=100929</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=100929</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/06/12/100929.aspx#comments</comments><description>I'm bummed that I couldn't make it to Tech Ed, Sahil is presenting and everyone I know is up there. Anyway, i've been reading Kent Tegels liveblog of Pablo Castro's ADO.NET 3.0 presentation report on ADO.NET 3.0 and am green with envy. Pablo is one of...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/06/12/100929.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=100929" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>Bill Vaughn's Blogging again</title><link>http://msmvps.com/blogs/williamryan/archive/2006/06/12/100922.aspx</link><pubDate>Mon, 12 Jun 2006 21:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:100922</guid><dc:creator>William</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=100922</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=100922</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/06/12/100922.aspx#comments</comments><description>Well, I'm out of commission today but a bit restless. Getting caught up on a few things. Anyway, Bill Vaughn is blogging again ago but I've forgotten to post it. Anyway, if you aren't familiar with him, Bill is the man and there is sure to be a lot of...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/06/12/100922.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=100922" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx">Misc Technology</category></item><item><title>Learn ADO.NET from the Best</title><link>http://msmvps.com/blogs/williamryan/archive/2006/06/06/99650.aspx</link><pubDate>Tue, 06 Jun 2006 21:29:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:99650</guid><dc:creator>William</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=99650</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=99650</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/06/06/99650.aspx#comments</comments><description>Well, saying someone is 'the best' is a pretty big statement, but one thing is certain, any discussion of 'the greatest talent in ADO.NET' will have Sahil's name featured prominently. Just look at what his people who read his book say! Anyway, if you...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/06/06/99650.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=99650" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx">Coding Techniques</category></item><item><title>DataView.ToTable method in the 2.0 Framework</title><link>http://msmvps.com/blogs/williamryan/archive/2006/06/06/99498.aspx</link><pubDate>Mon, 05 Jun 2006 23:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:99498</guid><dc:creator>William</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=99498</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=99498</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/06/06/99498.aspx#comments</comments><description>This is a really simple trick but it's way cool. Now that I have some time again, I've been trying to get up to speed with LINQ and ADO.NET 2.0. God I missed it. Anyway, this comes up in the newsgroups all the time so I figured I'd write up a quick sample...(&lt;a href="http://msmvps.com/blogs/williamryan/archive/2006/06/06/99498.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=99498" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category></item><item><title>Sahil's moving again...</title><link>http://msmvps.com/blogs/williamryan/archive/2006/05/24/96775.aspx</link><pubDate>Wed, 24 May 2006 16:02:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:96775</guid><dc:creator>William</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=96775</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=96775</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/05/24/96775.aspx#comments</comments><description>&lt;P&gt;&lt;FONT size=2&gt;Totally a day late and a dollar short on this (I think Sahil mailed me last week) but anyway, better late than never&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;New website - &lt;/FONT&gt;&lt;A href="http://www.winsmarts.com/"&gt;&lt;FONT size=2&gt;www.winsmarts.com&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &amp;lt;-- This is the suit/tie version of me. &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=2&gt;New blog - &lt;/FONT&gt;&lt;A href="http://blah.winsmarts.com/"&gt;&lt;FONT size=2&gt;http://blah.winsmarts.com&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; &lt;BR&gt;New RSS - &lt;/FONT&gt;&lt;A href="http://blah.winsmarts.com/rss2.aspx"&gt;&lt;FONT size=2&gt;http://blah.winsmarts.com/rss2.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=96775" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category></item><item><title>Using the SqlConnectionStringBuilder to guard against Connection String Injection Attacks</title><link>http://msmvps.com/blogs/williamryan/archive/2006/01/15/81115.aspx</link><pubDate>Sun, 15 Jan 2006 14:40:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:81115</guid><dc:creator>William</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/rsscomments.aspx?PostID=81115</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/williamryan/commentapi.aspx?PostID=81115</wfw:comment><comments>http://msmvps.com/blogs/williamryan/archive/2006/01/15/81115.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;One new object in the ADO.NET 2.0 Library worth taking a look at is the &lt;A href="http://blogs.msdn.com/DataAccess/archive/2005/03/30/403926.aspx"&gt;SqlConnectionStringBuilder&lt;/A&gt;&amp;nbsp;.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Considering how late it is in the game, you are probably&amp;nbsp;aware of the dangers of &lt;A href="http://search.msn.com/results.aspx?q=Sql+injection+Attacks&amp;amp;FORM=QBHP"&gt;Sql Injection Attacks&lt;/A&gt;&amp;nbsp;.&amp;nbsp;&amp;nbsp;One&amp;nbsp;the off chance you aren't,&amp;nbsp;let me throw in my two cents and recommend that you familiarize yourself with them ASAP.&amp;nbsp; Anyway, injection attacks are possible when you use dynamic string concatenation to build your Sql Statements and you don't paramaterize them or escape all possible malicious input.&amp;nbsp; This presents a small problem b/c you need to employ user input in your applications in many cases, but every time you accept user input, you increase the surface are of an attack.&amp;nbsp; And regrettably, there are too many cases where people 'solve' this problem by employing a solution worse than the problem itself.&amp;nbsp; For instance, I've seen some people hell bent of using Dynamic Sql (and not parameters) solve the injection problem by disallowing all special characters.&amp;nbsp; While this does address the problem directly, it has the unintended consequence of forcing the users to use less strong passwords.&amp;nbsp; And most of the cases that I've seen where people implemented this rule, they increased the lenght of possible passwords to offset this vulnerability. Well, that 'solution' opens you up to other sorts of mischief.&amp;nbsp; After all, if you only allow people ten characters for their password, there's only so much malicious sql they can push off on you.&amp;nbsp; But assuming you don't increase the length of the password, you just pretty much hamstrung the user into have to adopt a weaker password scheme.&amp;nbsp; I've bitched about &lt;a href="http://msmvps.com/blogs/williamryan/archive/2004/03/20/4063.aspx"&gt;this alot in the past&lt;/A&gt;&amp;nbsp;and it's not really the focus of this article so I'll cut it short here.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So what about Connection String injection attacks?&amp;nbsp; Well, yes, it's something you should guard against.&amp;nbsp; When I was first learning .NET, I created this application that stored User Name/Password combinations in a Database, both of which were encrypted.&amp;nbsp; This was&amp;nbsp; a particularly sensitive application and I was still pretty naive about security.&amp;nbsp; So I came up with a solution that entailed a good bit of extra maintenance but which I believed would give me extra security.&amp;nbsp; What I did was create a Sql Server login for every user.&amp;nbsp; So to even create the connection in the first place, I used their username/password combo to open the connection and then I ran an query that would check the authentication table, decrypt the username and password and pass back an output parameter indicating if they authenticated correctly or not.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;This was not just a bad idea, it was terrible.&amp;nbsp; For one thing, it was a nightmare to administer.&amp;nbsp; Every time we added a user, I'd have to create a new Sql Server account and had to use a utility I wrote to hash the password.&amp;nbsp; Other than being a pain in the neck, this made it impossible to add a new user for use with many of our applications without having to use my utlity (which people were unable to find on multiple occassions).&amp;nbsp; Another problem was with connection pooling.&amp;nbsp; If you have different connection strings for every user, it can have a serious adverse affect with &lt;A href="http://www.sql-server-performance.com/sk_connection_pooling_myths.asp"&gt;Connection Pooling&lt;/A&gt;&amp;nbsp;. Anyway, I thought all of this was worth it all in all b/c of the extra security benefit.&amp;nbsp; Then &lt;A href="http://blogs.msdn.com/angelsb/"&gt;Angel Saenz-Badillos&lt;/A&gt;&amp;nbsp;saw a post I had&amp;nbsp;that described&amp;nbsp;what I was doing and he set me straight.&amp;nbsp; You see, my whole concept was based on the fact that I didn't realize you could hack the connection string (don't ask me why, it should have been clear to me from the get go).&amp;nbsp; But all it takes for someone to have caused some mischief for me was to add Max Pool Size 100000000; Min Pool Size 100000000 to the password field. Sure, we are used to limiting the field size in many cases for fields that we accept input from but it's not unheard of for someone to leave it the default size.&amp;nbsp; Another trick that they could do is add "; Trusted_Connection = true".&amp;nbsp; This will cause a 'last one wins' scenario so in the case of my app, the machine account would be used instead of the assigned user account and if it had more privileges than the user account did, well, there was just an escalation of privilege.&amp;nbsp; Combined with a Sql Injection attack, this could cause some problems.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The good news is that in order to do much damage, the attacker would need to know the username and password or the machine itself would have to have sufficient permissions with the Sql Server to allow something troublesome to happen.&amp;nbsp; But relying primarily on 'luck' to not get hacked is kind of a lame strategy.&amp;nbsp; The other thing about Connection String Injection attacks is that if everything else is handled correctly (no unparamaterized queries allowed) then the attack surface is pretty much limited to non-permanent items or things that are just annoyances (although depending on the nature of your data, these annoyances could get quite serious very quickly).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So how do you address this issue?&amp;nbsp; Fortunately the good folks on the &lt;A href="http://blogs.msdn.com/dataaccess/default.aspx"&gt;DataWorks Team&lt;/A&gt;&amp;nbsp;gave use the SqlConnectionStringBuilder.&amp;nbsp; Basically, it handles the escaping issues for you and has the side benefit of being easier to use.&amp;nbsp; For one thing you can use it just like you would you old connection strings if you're dead set on not changing your ways:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnectionStringBuilder&lt;/STRONG&gt;&lt;/FONT&gt; OldSchool = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnectionStringBuilder&lt;/STRONG&gt;&lt;/FONT&gt;(&lt;FONT color=#a52a2a&gt;"Data Source=Clock1;Initial Catalog=Pr0nStarz;User Id=CuckooBurd;Password=++dfjk33nmjKLLa;"&lt;/FONT&gt;);&lt;BR&gt;&lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnection&lt;/STRONG&gt;&lt;/FONT&gt; cn = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnection&lt;/STRONG&gt;&lt;/FONT&gt;(OldSchool.ToString());&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;Now you can use the SqlConnectionStringBuilder just like this, it's as easy as pie:&lt;/FONT&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;/CODE&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;FONT color=#0000ff&gt;private void&lt;/FONT&gt; DemoConnectionStringBuilder()&lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SqlConnectionStringBuilder&lt;/STRONG&gt;&lt;/FONT&gt; ConnectionBuilder = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;STRONG&gt;&lt;FONT color=#7fffd4&gt;SqlConnectionStringBuilder&lt;/FONT&gt;&lt;/STRONG&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp; ConnectionBuilder.DataSource = &lt;STRONG&gt;&lt;FONT color=#7fffd4&gt;SecurityUtil&lt;/FONT&gt;&lt;/STRONG&gt;.DecryptText&lt;FONT color=#a52a2a&gt;(@"#*a0-%%% ^889333"&lt;/FONT&gt;,&amp;nbsp;&amp;nbsp;&lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SecurityUtil&lt;/STRONG&gt;&lt;/FONT&gt;.CryptoProviders.TripleDES); &lt;BR&gt;&amp;nbsp; ConnectionBuilder.InitialCatalog = &lt;FONT color=#7fffd4&gt;&lt;STRONG&gt;SecurityUtil&lt;/STRONG&gt;&lt;/FONT&gt;.DecryptText(&lt;FONT color=#a52a2a&gt;"pR9s4%~`"&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;//Here you can specify either&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; ConnectionBuilder.IntegratedSecurity = &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;//ConnectionBuilder.UserID = SecurityUtil.DecryptText("pR9s4%~`") ;&lt;BR&gt;&amp;nbsp; //ConnectionBuilder.Password =&amp;nbsp; SecurityUtil.DecryptText("!Cuck00zR~!e", SecurityUtil.CryptoProviders.TripleDES);&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;using&lt;/FONT&gt;(&lt;FONT color=#7fffd4&gt;SqlConnection&lt;/FONT&gt; MainConnection = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#7fffd4&gt;SqlConnection&lt;/FONT&gt;(ConnectionBuilder.ToString())){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MainConnection.Open();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//Do your thing&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MainConnection.Close();&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/CODE&gt;&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;In the above example, I went with Integrated Security and commented out the username and password, but you can switch these back and forth.&amp;nbsp; All of the properties like Max Pool Size, Pooling, Workstation ID, PacketSize, everything you normally manipulate is there and since you have intellisense support, you have cues as to just about everything you may need.&amp;nbsp; Moreoever, if you want to be really safe, you can also create another wrapper class that exposes some of there properties but limits Max Pool Size or Min Pool Size in the accessors.&amp;nbsp; For instance it could check one vs the other and if you aren't comfortable with the numbers, you can throw an exception, change them to something you like, or do whatever you see fit. Same goes for the UserName/Password and Trusted Connection. Although it will escape any attempt to try to put Trusted_Connection = true as a value, you can use your class to manually ensure that only one or the other is chosen.&amp;nbsp; Right out of the Box the SqlConnectionStringBuilder is very powerful and can give you most of the functionality you'd ever want but there may be a case or two where you need everything to be even more granular - in which case you can easily implement such a scenario.&amp;nbsp; Sure, as far as features go, this is more evolutionary than revolutionary, but it's a nice touch.&amp;nbsp; If nothing else it will keep you from having to flip over to &lt;A href="http://www.connectionstrings.com/"&gt;http://www.connectionstrings.com&lt;/A&gt; over and over when you are building new applications&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;-----&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;As an aside, I've listed the two primary targets for a Connection String injection attack but I'm not convniced that there aren't any other ones. If you can think of any other mischief you can cause via the connection string, be a pal and shoot me your idea - I'll include it as an addendum to this post and give you the credit.&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=81115" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx">.NET General</category><category domain="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+2005/default.aspx">Visual Studio .NET 2005</category></item></channel></rss>