<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>.Net</title>
        <link>http://weblogs.sqlteam.com/mladenp/category/222.aspx</link>
        <description>.Net</description>
        <language>en-US</language>
        <copyright>Mladen Prajdić</copyright>
        <managingEditor>spirit1_fe@yahoo.com</managingEditor>
        <generator>Subtext Version 1.9.4.0</generator>
        <item>
            <title>Ease your SSMS experience: SSMS Tools PACK 1.0 is out!</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2008/05/08/Ease-your-SSMS-experience-SSMS-Tools-PACK-1.0-is-out.aspx</link>
            <description>&lt;p&gt;After a long while I've finally managed to create a release version. I've also added some cool new features.&lt;/p&gt;
&lt;p&gt;It is completely free and has no expiration date like the prior beta versions.&lt;/p&gt;
&lt;p&gt;I've also changed the RSS feed to Feedburner to which you can subscribe to at: &lt;a title="http://feeds.feedburner.com/SsmsToolsPack" href="http://feeds.feedburner.com/SsmsToolsPack"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;http://feeds.feedburner.com/SsmsToolsPack&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you're subscribed to the old feed please change it.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;In &lt;a target="_blank" href="http://www.ssmstoolspack.com/"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;SSMS Tools Pack 1.0&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;  you can find these features:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#FKW"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Uppercase/Lowercase keywords&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;          Set all keywords to uppercase or lowercase letters. Custom keywords can be added. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#RMS"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Run one script on multiple databases&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;          Run selected or full window text on selected databases on the currently connected server. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#CEP"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Copy execution plan bitmaps to clipboard&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;          Copy selected or all execution plans to a bitmap that is saved on the clipboard. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#SRE"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Search Results in Grid Mode and Execution Plans&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;          Find all occurrences of your search string in the execution plans or in the results in datagrid mode. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#GIS"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Generate Insert statements for a single table, the whole database or current resultsets in grids&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;          Generate insert statement from your data. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#SSC"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Query Execution History (Soft Source Control)&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;:  &lt;/p&gt;
&lt;p&gt;           Save all executed queries to file or database and easily find them. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#RDS"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Text document Regions and Debug sections&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;:  &lt;/p&gt;
&lt;p&gt;           Add Regions and Debug section in your scripts to ease development experience. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#RCS"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Running custom scripts from Object explorer's Context menu&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;:  &lt;/p&gt;
&lt;p&gt;           Speedy execution of custom scripts from Object Explorer's context menus. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#CRUD"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;CRUD (Create, Read, Update, Delete) stored procedure generation&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;           Generate Customizable CRUD stored procedures for all tables in your database. &lt;/p&gt;
&lt;p&gt;- &lt;a target="_blank" href="http://www.ssmstoolspack.com/Features.aspx#NQT"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;New query template&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;           Create a template that is shown when creating a new query window. &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;Currently supported SQL Server Management Studio versions are: &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.ssmstoolspack.com/Download.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;SQL Server Management Studio 2008 CTP&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.ssmstoolspack.com/Download.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;SQL Server Management Studio 2005&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.ssmstoolspack.com/Download.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;SQL Server Management Studio 2005 Express&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;Hope you enjoy it! &lt;/p&gt;
&lt;p&gt;And if you're feeling extra generous there's always &lt;a target="_blank" href="http://www.ssmstoolspack.com/Download.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;PayPal&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;. :) &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2008%2f05%2f08%2fEase-your-SSMS-experience-SSMS-Tools-PACK-1.0-is-out.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2008%2f05%2f08%2fEase-your-SSMS-experience-SSMS-Tools-PACK-1.0-is-out.aspx" /&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;table width="100%"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align="left"&gt;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align="left"&gt;
            &lt;p&gt;&lt;img id="imgAdd" alt="" onload="javascript: try { SwitchToAdd(); } catch(e) {}" name="imgAdd" src="http://weblogs.sqlteam.com/images/weblogs_sqlteam_com/mladenp/225/r_OneWhitePixel.bmp" /&gt; &lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60592.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2008/05/08/Ease-your-SSMS-experience-SSMS-Tools-PACK-1.0-is-out.aspx</guid>
            <pubDate>Thu, 08 May 2008 08:35:14 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60592.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2008/05/08/Ease-your-SSMS-experience-SSMS-Tools-PACK-1.0-is-out.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60592.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60592.aspx</trackback:ping>
        </item>
        <item>
            <title>Watershed Image Segmentation in C#</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2008/02/11/Watershed-Image-Segmentation-in-C.aspx</link>
            <description>&lt;p&gt;This is an implementation of the Grayscale Immersion Watershed Segmentation in C# based on the &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vincent-Soille immersion watershed algorithm&lt;/strong&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Read &lt;a href="http://weblogs.sqlteam.com/mladenp/archive/2008/02/11/Watershed-Image-Segmentation-in-C.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Full Post&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60503.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2008/02/11/Watershed-Image-Segmentation-in-C.aspx</guid>
            <pubDate>Mon, 11 Feb 2008 17:46:53 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60503.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2008/02/11/Watershed-Image-Segmentation-in-C.aspx#feedback</comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60503.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60503.aspx</trackback:ping>
        </item>
        <item>
            <title>Automated GUI testing - Is it worth it?</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2008/01/03/Automated-GUI-testing---Is-it-worth-it.aspx</link>
            <description>&lt;p&gt;In 2007 I've &lt;a target="_blank" href="http://weblogs.sqlteam.com/mladenp/archive/2007/03/01/60123.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;worked&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; a &lt;a target="_blank" href="http://weblogs.sqlteam.com/mladenp/archive/2007/03/22/60140.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;lot&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; with &lt;a target="_blank" href="http://nunitforms.sourceforge.net/"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;NUnitForms&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;. It contains all major controls testers and you can easily create&lt;/p&gt;
&lt;p&gt;your own ones for e.g. a Data Grid or a 3rd party control. I had to create one for Janus GridEx and it wasn't really &lt;/p&gt;
&lt;p&gt;that hard. A little reflection went a long way :) Lately, the whole project was at a standstill for some time but now it seems&lt;/p&gt;
&lt;p&gt;it's revitalizing nicely with new people on board. So if you haven't yet go take look. This is just one open source GUI testing platform &lt;/p&gt;
&lt;p&gt;and I'm sure there are others... I haven't checked them out though.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Now to the big question: Is it worth it?  It depends...&lt;/p&gt;
&lt;p&gt;I'm not a hardcore TDD practitioner but I like having repeatable unit tests. But having automated GUI unit tests is in my opinion a waste of time.&lt;/p&gt;
&lt;p&gt;Why? It simply isn't worth spending time writing them. You should have enough code coverage with non GUI tests to find any bugs long before &lt;/p&gt;
&lt;p&gt;hitting the GUI. You might want to be tempted to unit test control positions or visibility or some other property... don't bother. &lt;/p&gt;
&lt;p&gt;You'll spend your time better if you write more non GUI unit tests and check your GUI by hand (eye).&lt;/p&gt;
&lt;p&gt;So what are they useful for? Well... I've used them for acceptance and integration testing with great success.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integration Tests...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;... test how different parts of your application work together. These kinds of GUI tests proved to be VERY useful and they are worth investing time in.&lt;/p&gt;
&lt;p&gt;They have a great ROI (return on investment) once they're written.&lt;/p&gt;
&lt;p&gt;For example we had a large workflow based application that was completely async in nature. It had a windows forms client that could be deployed on &lt;/p&gt;
&lt;p&gt;multiple computers, all those clients connected to a single server that hosted a few webservices for data modifications, retrieval and some other stuff. &lt;/p&gt;
&lt;p&gt;The whole app was also connected to Sharepoint server,  Exchange Server, SQL Server, used InfoPath and a 3rd party software to export data from &lt;/p&gt;
&lt;p&gt;and into it. With one single GUI integration test we could easily see if everything worked together as it should. We mocked the InfoPath and &lt;/p&gt;
&lt;p&gt;3rd party software but everything else ran great. &lt;/p&gt;
&lt;p&gt;The point of using GUI tests here is to see how and if your whole application works with all parts integrated together from GUI interaction &lt;/p&gt;
&lt;p&gt;to Exchange connectivity. Even the best non GUI integration tests simply don't do that. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Acceptance Tests...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;... test if your software is up to some specs usually defined by the business process. They're in essence a black box test. &lt;/p&gt;
&lt;p&gt;You don't care what goes on inside the software you just want to see if the output is correct for a certain input. &lt;/p&gt;
&lt;p&gt;In workflow based processes this can be very useful since you know what the input and output parameters are for your workflow. &lt;/p&gt;
&lt;p&gt;For example you start the workflow in your app via NUnitForms, pressing "move in workflow" buttons until the workflow end and then check if &lt;/p&gt;
&lt;p&gt;the output parameters have the correct values. You can check for various different GUI parameters in this test along the way but as I said above &lt;/p&gt;
&lt;p&gt;don't go overboard. I usually just check for visibility of certain panels or grids... simple things like that.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;When I first started with GUI testing I thought it was a really big waste of time. And to tell you the truth if you don't draw the line somewhere it is.&lt;/p&gt;
&lt;p&gt;I even had a moment when I thought it was a good idea to test everything only with GUI tests. That was so far over line I couldn't even see it anymore.&lt;/p&gt;
&lt;p&gt;Luckily that moment passed pretty fast. Don't make the same mistake. If used wisely automated GUI tests are a big benefit.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2008%2f01%2f03%2fAutomated-GUI-testing---Is-it-worth-it.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2008%2f01%2f03%2fAutomated-GUI-testing---Is-it-worth-it.aspx" /&gt;&lt;/a&gt;
&lt;table width="100%"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align="left"&gt;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align="left"&gt;
            &lt;p&gt;&lt;img id="imgAdd" alt="" onload="javascript: try { SwitchToAdd(); } catch(e) {}" name="imgAdd" src="http://weblogs.sqlteam.com/images/weblogs_sqlteam_com/mladenp/225/r_OneWhitePixel.bmp" /&gt; &lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60446.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2008/01/03/Automated-GUI-testing---Is-it-worth-it.aspx</guid>
            <pubDate>Thu, 03 Jan 2008 20:21:08 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60446.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2008/01/03/Automated-GUI-testing---Is-it-worth-it.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60446.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60446.aspx</trackback:ping>
        </item>
        <item>
            <title>SQL Server 2005 evil DBA prank</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2007/11/15/SQL-Server-2005-evil-DBA-prank.aspx</link>
            <description>&lt;p&gt;Today I feel a bit evil minded so I thought I'd share this little prank-friendly function.&lt;/p&gt;
&lt;p&gt;If you put this into a .Net Assembly you import to SQL Server as a function or a stored procedure&lt;/p&gt;
&lt;p&gt;you can wreck some real havoc :)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private &lt;/span&gt;&lt;span class="kwrd"&gt;static &lt;/span&gt;&lt;span class="kwrd"&gt;void &lt;/span&gt;SQLPrank()
{
    Random r1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Random(DateTime.Now.Millisecond);
    &lt;span class="kwrd"&gt;int&lt;/span&gt; lowerBound = r1.Next(1000, 2000);
    &lt;span class="kwrd"&gt;int&lt;/span&gt; upperBound = r1.Next(3000, 4000);
    &lt;span class="kwrd"&gt;int&lt;/span&gt; randomNumber = r1.Next(1000, 4000);
    &lt;span class="rem"&gt;/*&lt;/span&gt;
&lt;span class="rem"&gt;    1000             2000             3000             4000&lt;/span&gt;
&lt;span class="rem"&gt;      |----------------|----------------|----------------|&lt;/span&gt;
&lt;span class="rem"&gt;      .....|...................................|..........&lt;/span&gt;
&lt;span class="rem"&gt;    random lower bound                  random upper bound&lt;/span&gt;
&lt;span class="rem"&gt;      ..........................|.........................&lt;/span&gt;
&lt;span class="rem"&gt;                        random number &lt;/span&gt;
&lt;span class="rem"&gt;      |----|-----------------------------------|---------| &lt;/span&gt;
&lt;span class="rem"&gt;       Exit          Normal operation             Wait&lt;/span&gt;
&lt;span class="rem"&gt;    */&lt;/span&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (randomNumber &amp;gt;= 1000 &amp;amp;&amp;amp; randomNumber &amp;lt; lowerBound)
        Environment.Exit(0);            
    &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (randomNumber &amp;gt;= upperBound &amp;amp;&amp;amp; randomNumber &amp;lt; 4000)
        Thread.Sleep(5000);
}&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The gem here is the Environment.Exit(0) which shuts down SQL Server without anyone having a clue why.&lt;/p&gt;
&lt;p&gt;This is perfect for a prank on your least favorite DBA or developer. :)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2007%2f11%2f15%2fSQL-Server-2005-evil-DBA-prank.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2007%2f11%2f15%2fSQL-Server-2005-evil-DBA-prank.aspx" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60406.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2007/11/15/SQL-Server-2005-evil-DBA-prank.aspx</guid>
            <pubDate>Thu, 15 Nov 2007 21:05:37 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60406.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2007/11/15/SQL-Server-2005-evil-DBA-prank.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60406.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60406.aspx</trackback:ping>
        </item>
        <item>
            <title>C#: Care about Event Memory Leaks with Delegate.GetInvocationList()</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2007/10/24/C-Care-about-Event-Memory-Leaks-with-Delegate.GetInvocationList.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;UPDATE: &lt;/font&gt;&lt;br /&gt;
&lt;/strong&gt;After i've been proven wrong in the comments below I have to say this:&lt;/p&gt;
&lt;p&gt;Go take a read of &lt;a target="_blank" href="http://www.interact-sw.co.uk/iangblog/2004/07/07/circulareventrefs"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;this article&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; to see how circular references are really handled.&lt;/p&gt;
&lt;p&gt;While Delegate.GetInvocationList() really is a great and usefull thing and it could be used in clearing up events, &lt;/p&gt;
&lt;p&gt;there's no need for it since you can do that as easily by simply unsubscribin from the event when &lt;/p&gt;
&lt;p&gt;you want to dispose your class.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;You can read this post on,  but know that this example is &lt;strong&gt;WRONG&lt;/strong&gt;, except for the last part about &lt;/p&gt;
&lt;p&gt;Observer pattern and WeakEvent pattern. &lt;/p&gt;
&lt;p&gt;Maybe you should read this post since sometimes you can learn how stuff works by reading how it doesn't work :)) &lt;/p&gt;
&lt;p&gt;---------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;Subscribed events are one of the most common reasons of memory leaks in .Net. This means that if you have an object that has an event &lt;/p&gt;
&lt;p&gt;and there are other object that are subscribed to that event, the original object won't be properly disposed until all events are unsubscribed since &lt;/p&gt;
&lt;p&gt;an event is a strong reference. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;A simple example of this is a form called MyForm that has a public event called OnDoMyFormThing and 5 classes are subscribed to this event. &lt;/p&gt;
&lt;p&gt;When the OnDoMyFormThing is executed on the form it will notify all 5 classes. You might call this event a few more times depending on what your form does. &lt;/p&gt;
&lt;p&gt;After this the form is closed. However the form isn't disposed until all 5 classes that are subscribed to the event get disposed. A hard way of doing this &lt;/p&gt;
&lt;p&gt;would be to somehow implement the event removal on all 5 classes. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;An easy way would be to do this in the Dispose method of the form itself. But how, if you don't know the name of every event handler.&lt;/p&gt;
&lt;p&gt;But remeber that an event is just a delegate. And delegates have a GetInvocationList() method.&lt;/p&gt;
&lt;p&gt;GetInvocationList() gets an array of delegates. Each delegate represents a method subscribed to an event. The order of the delgates is the same as the &lt;/p&gt;
&lt;p&gt;invocation order of the subscribed methods on the event.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;So your code in MyForm would be: &lt;/p&gt;
&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyForm : Form
 {    
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler OnDoMyFormThing;
    
    &lt;span class="kwrd"&gt;public&lt;/span&gt; MyForm()
    {
        InitializeComponent();        
    }
    
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; button1_OnClick
    {
        MessageBox.Show(&lt;span class="str"&gt;"Test of OnDoMyFormThing event"&lt;/span&gt;);
        OnDoMyFormThing(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; EventArgs());
    }
    
    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose(&lt;span class="kwrd"&gt;bool&lt;/span&gt; disposing)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (disposing &amp;amp;&amp;amp; (components != &lt;span class="kwrd"&gt;null&lt;/span&gt;))
        {
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (EventHandler eventDelegate &lt;span class="kwrd"&gt;in&lt;/span&gt; OnDoMyFormThing.GetInvocationList())
                OnDoMyFormThing -= eventDelegate;
            components.Dispose();
        }
        &lt;span class="kwrd"&gt;base&lt;/span&gt;.Dispose(disposing);
    }
}&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;And with this your form can be disposed normally.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Event subscriptions in 5 classes look like this: &lt;/p&gt;
&lt;pre class="csharpcode"&gt;class1.MyForm.OnDoMyFormThing += Class1EventHandler
class2.MyForm.OnDoMyFormThing += Class2EventHandler
class3.MyForm.OnDoMyFormThing += Class3EventHandler
class4.MyForm.OnDoMyFormThing += Class4EventHandler
class5.MyForm.OnDoMyFormThing += Class5EventHandler&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The strong bidirectional reference between an event and its subscriptions is a common problem in all &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Observer_pattern"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Observer pattern&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; scenarions, so you must &lt;/p&gt;
&lt;p&gt;know about it and care about it. If not, you're sure to get memory leaks.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;In .Net ramework 3.0 there is a pattern called &lt;a target="_blank" href="http://msdn2.microsoft.com/en-us/library/aa970850.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;WeakEvent&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; that you can use to create a weak reference to events and not really care about disposal.&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2007%2f10%2f24%2fC-Care-about-Event-Memory-Leaks-with-Delegate.GetInvocationList.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2007%2f10%2f24%2fC-Care-about-Event-Memory-Leaks-with-Delegate.GetInvocationList.aspx" /&gt;&lt;/a&gt;
&lt;table width="100%" unselectable="on"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align="left"&gt;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align="left"&gt;
            &lt;p&gt;&lt;img id="imgAdd" alt="" onload="javascript: try { SwitchToAdd(); } catch(e) {}" name="imgAdd" src="http://weblogs.sqlteam.com/images/weblogs_sqlteam_com/mladenp/225/r_OneWhitePixel.bmp" /&gt; &lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60385.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2007/10/24/C-Care-about-Event-Memory-Leaks-with-Delegate.GetInvocationList.aspx</guid>
            <pubDate>Wed, 24 Oct 2007 18:30:02 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60385.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2007/10/24/C-Care-about-Event-Memory-Leaks-with-Delegate.GetInvocationList.aspx#feedback</comments>
            <slash:comments>24</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60385.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60385.aspx</trackback:ping>
        </item>
        <item>
            <title>C# : Get current Caret Line and Column in a multiline Windows Forms TextBox</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2007/10/19/C--Get-current-Caret-Line-and-Column-in-a.aspx</link>
            <description>&lt;p&gt;I can't believe these properties aren't already natively implemented. Come on Microsoft... we do live in the year 2007 you know!!&lt;/p&gt;
&lt;p&gt;I know that you can do this using P/Invoke and SendMessage but i wanted a nice managed way of finding &lt;/p&gt;
&lt;p&gt;the current line and column of the Caret position in a multiline TextBox.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;After a bit of experimenting i've come up with this extended class:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TextBoxEx : TextBox
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; TextBoxEx()
    { }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GoTo(&lt;span class="kwrd"&gt;int&lt;/span&gt; line, &lt;span class="kwrd"&gt;int&lt;/span&gt; column)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (line &amp;lt; 1 || column &amp;lt; 1 || &lt;span class="kwrd"&gt;this&lt;/span&gt;.Lines.Length &amp;lt; line)
            &lt;span class="kwrd"&gt;return&lt;/span&gt;;
        
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.SelectionStart = &lt;span class="kwrd"&gt;this&lt;/span&gt;.GetFirstCharIndexFromLine(line - 1) + column - 1;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.SelectionLength = 0;
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CurrentColumn
    {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.SelectionStart - &lt;span class="kwrd"&gt;this&lt;/span&gt;.GetFirstCharIndexOfCurrentLine() + 1; }
    }
 
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CurrentLine
    {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.GetLineFromCharIndex(&lt;span class="kwrd"&gt;this&lt;/span&gt;.SelectionStart) + 1; }
    }
}&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Hope you find it usefull. If anyone knows a better way do let me know.&lt;/p&gt;
&lt;p&gt;UPDATE: With a bit of help from &lt;a href="http://tozon.info/blogs/andrej/default.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Andrej&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; this is a better and shorter version with set method too.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2007%2f10%2f19%2fC--Get-current-Caret-Line-and-Column-in-a.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.sqlteam.com%2fmladenp%2farchive%2f2007%2f10%2f19%2fC--Get-current-Caret-Line-and-Column-in-a.aspx" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60380.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2007/10/19/C--Get-current-Caret-Line-and-Column-in-a.aspx</guid>
            <pubDate>Fri, 19 Oct 2007 13:40:41 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60380.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2007/10/19/C--Get-current-Caret-Line-and-Column-in-a.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60380.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60380.aspx</trackback:ping>
        </item>
        <item>
            <title>.Net: Passing user data with Exception back to the caller method</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2007/09/24/.Net-Passing-user-data-with-Exception-back-to-the-caller.aspx</link>
            <description>&lt;p&gt;We're all familiar (i hope :)) with this construct:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt;
{
    &lt;span class="rem"&gt;// ... some code here ...&lt;/span&gt;
}
&lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
{
    &lt;span class="rem"&gt;// one of these 2 lines are usually seen&lt;/span&gt;
    &lt;span class="kwrd"&gt;throw&lt;/span&gt;; &lt;span class="rem"&gt;// presereves the full call stack&lt;/span&gt;
    &lt;span class="rem"&gt;//throw ex; // changes the origin of exception to this method&lt;/span&gt;
}
&lt;span class="kwrd"&gt;finally&lt;/span&gt;
{ 
    &lt;span class="rem"&gt;// more stuff here&lt;/span&gt;
}&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;It's a standard error catching routine in .Net.&lt;/p&gt;
&lt;p&gt;But what if you want to pass some user info back to the caller method with the Exception being thrown?&lt;/p&gt;
&lt;p&gt;Reader... meet Exception.Data. Exception.Data... meet reader. &lt;/p&gt;
&lt;p&gt;Now that you're both properly aquainted let see what it does.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exception.Data&lt;/strong&gt; is a dictionatry that holds object for key and value. This means that you can put anything into it.&lt;/p&gt;
&lt;p&gt;Here's how my standard catch code part looks like:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
{
    &lt;span class="rem"&gt;// pass the ex to preserve full stac trace&lt;/span&gt;
    Exception exNew = &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;"New exception message"&lt;/span&gt;, ex);
    exNew.Data.Add(&lt;span class="str"&gt;"string Data"&lt;/span&gt;, &lt;span class="str"&gt;"data"&lt;/span&gt;);
    exNew.Data.Add(&lt;span class="str"&gt;"int data"&lt;/span&gt;, 1);
    exNew.Data.Add(&lt;span class="str"&gt;"bool data"&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);
    exNew.Data.Add(&lt;span class="str"&gt;"DateTime data"&lt;/span&gt;, DateTime.Now);
    &lt;span class="rem"&gt;// full ex info with user data&lt;/span&gt;
    &lt;span class="kwrd"&gt;throw&lt;/span&gt; exNew;
}&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I've seen a lot of code and i've never seen this being used. I have seen other way overcomplicated methods being used for the same functionality though. :)&lt;/p&gt;
&lt;p&gt;Even though .Data is the first property in the Exception intellisense list it gets overlooked.  How? I have no idea.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://weblogs.sqlteam.com/mladenp/archive/2007/09/24/.Net-Passing-user-data-with-Exception-back-to-the-caller.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://weblogs.sqlteam.com/mladenp/archive/2007/09/24/.Net-Passing-user-data-with-Exception-back-to-the-caller.aspx" border="0" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60338.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2007/09/24/.Net-Passing-user-data-with-Exception-back-to-the-caller.aspx</guid>
            <pubDate>Mon, 24 Sep 2007 15:36:37 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60338.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2007/09/24/.Net-Passing-user-data-with-Exception-back-to-the-caller.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60338.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60338.aspx</trackback:ping>
        </item>
        <item>
            <title>Little .Net tip: Start using List&amp;lt;T&amp;gt;.ForEach()</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2007/09/01/Little-.Net-tip-Start-using-ListT.ForEach.aspx</link>
            <description>&lt;p&gt;I haven't been using this function at all. Who knows why... maybe because i didn't know about it :)&lt;/p&gt;
&lt;p&gt;But in my latest pet project i had to do something really quickly on a lot of items in a list.&lt;/p&gt;
&lt;p&gt;After a bit of research into foreach and for loops, i saw the List&amp;lt;T&amp;gt;.ForEach method.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Did some testing and sure thing &lt;strong&gt;List&amp;lt;T&amp;gt;.ForEach proved to be faster&lt;/strong&gt; than others.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I thought about posting the whole setup and how i've tested it, but then i saw that &lt;a target="_blank" href="http://diditwith.net/default.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Dustin Russell Campbell&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;did exactly the same thing a bit more thoroughly, so why double it up, right? &lt;/p&gt;
&lt;p&gt;Read it, like it, USE it!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://diditwith.net/2006/10/05/PerformanceOfForeachVsListForEach.aspx" target="_blank"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;Performance of foreach vs. List.ForEach&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Simply rocks!&lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60318.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2007/09/01/Little-.Net-tip-Start-using-ListT.ForEach.aspx</guid>
            <pubDate>Sat, 01 Sep 2007 19:37:13 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60318.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2007/09/01/Little-.Net-tip-Start-using-ListT.ForEach.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60318.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60318.aspx</trackback:ping>
        </item>
        <item>
            <title>.Net Windows Forms ListView ColumnHeader width tip. Set it to -1 or -2.</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2007/08/29/60311.aspx</link>
            <description>&lt;p&gt;A negative Width value?? &lt;/p&gt;
&lt;p&gt;I can hear it now:&lt;/p&gt;
&lt;p&gt;Are you insane Mladen?? Do you want our apps going around looking ugly??&lt;/p&gt;
&lt;p&gt;Well... of course I do! It means i can go around fixing them for big bucks :))&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;But joking aside, -1 and -2 width values are very usefull. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Setting the &lt;strong&gt;width to be -1&lt;/strong&gt; means that the column will have the &lt;strong&gt;width of the longest item in it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Setting the &lt;strong&gt;width to be -2&lt;/strong&gt; means that the column will have the &lt;strong&gt;width of the column heading&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Pretty cool, no?&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://weblogs.sqlteam.com/mladenp/archive/2007/08/29/60311.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://weblogs.sqlteam.com/mladenp/archive/2007/08/29/60311.aspx" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60311.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdić</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2007/08/29/60311.aspx</guid>
            <pubDate>Wed, 29 Aug 2007 17:25:00 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60311.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2007/08/29/60311.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60311.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60311.aspx</trackback:ping>
        </item>
        <item>
            <title>Ways to revert a database to pre-Test state after Unit testing</title>
            <link>http://weblogs.sqlteam.com/mladenp/archive/2007/07/06/60250.aspx</link>
            <description>Tests are a pretty much a must in today's world of programming. There's even a whole Test Driven Development methodology that deals with this.
&lt;br /&gt;&lt;br /&gt;
There comes a time when we have to test how our app interacts with the database.
&lt;br /&gt;&lt;br /&gt;
More &lt;a href="http://weblogs.sqlteam.com/mladenp/archive/2007/07/06/60250.aspx"&gt;&lt;strong&gt;&lt;font color="#004080"&gt;here&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;img src="http://weblogs.sqlteam.com/mladenp/aggbug/60250.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Mladen Prajdic</dc:creator>
            <guid>http://weblogs.sqlteam.com/mladenp/archive/2007/07/06/60250.aspx</guid>
            <pubDate>Fri, 06 Jul 2007 17:00:18 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/mladenp/comments/60250.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/mladenp/archive/2007/07/06/60250.aspx#feedback</comments>
            <slash:comments>11</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/mladenp/comments/commentRss/60250.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/mladenp/services/trackbacks/60250.aspx</trackback:ping>
        </item>
    </channel>
</rss>