<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.simple-talk.com/community/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>Nigel Morse</title><link>http://www.simple-talk.com/community/blogs/nigel_morse/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.0 (Debug Build: 60217.2664)</generator><item><title>The Making of SQL Response : Battle of the Testers</title><link>http://www.simple-talk.com/community/blogs/nigel_morse/archive/2008/09/12/69500.aspx</link><pubDate>Fri, 12 Sep 2008 16:54:00 GMT</pubDate><guid isPermaLink="false">f46e5dea-70cd-4a69-a7e1-fd07a313bd4d:69500</guid><dc:creator>Nigel Morse</dc:creator><slash:comments>2</slash:comments><comments>http://www.simple-talk.com/community/blogs/nigel_morse/comments/69500.aspx</comments><wfw:commentRss>http://www.simple-talk.com/community/blogs/nigel_morse/commentrss.aspx?PostID=69500</wfw:commentRss><description>    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;I’ve just closed my last bug on
            SQL Response (or at least the last one that’s left on my plate for this version).
            Code freeze is tomorrow after which it gets a complete going over by the testers
            and pending any major dramas should be released in the next few weeks.
            
            &lt;o:p&gt;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;When I joined Red Gate they said
            they tended to do short projects – a few months or so before shipping the new version
            of the product. Great! This was going to be a sharp contrast to my previous employment
            where we worked on essentially one large product (parts of which were 15-20 years
            old).&lt;span&gt;&amp;nbsp; &lt;/span&gt;Projects there tended to be on
            the long side, but Response has been a 14 month project which is quite a while for
            Red Gate.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;So the length of project wasn’t
            new to me, however the major contrast is that the team I’ve been on were responsible
            for the whole of the product and not just one little bit of it.&lt;span&gt;&amp;nbsp;
            &lt;/span&gt;This means my sense of involvement and responsibility has been much greater.
            I’m also one of the people who have been on this project fulltime since the outset
            which is probably why I think of it more fondly. It’s my first major piece of work
            at Red Gate and as such it’s also shown me a very new and, in my opinion, a much
            better way to build software. Which is why I’ve really (really, really) enjoyed
            working here so far.
            &lt;o:p&gt;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;So what was new (to me) about the
            process? Well in terms of the overall structure –Design, Implement, Test, rinse
            and repeat – not much. It’s more the depth and execution of each of those steps&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;b&gt;&lt;span&gt;
            &lt;span&gt;Design&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Initially it started with our designer
            (Dom), the product manager (Colin), the initial project manager (Dan A) and myself
            going out and talking to customers and trying to build up a picture of what they
            wanted.&lt;span&gt;&amp;nbsp; &lt;/span&gt;
            &lt;o:p&gt;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;For a start the very idea of having
            a user experience designer was a whole new one, in the past I had to come up with
            my own UI and given art is the probably the only exam I’ve ever failed you can rest
            assured that my aesthetic ability is fairly minimal.&lt;span&gt;&amp;nbsp;
            &lt;/span&gt;The best way to describe it is that Dom designs the “User Experience” and
            it’s very much this design that drives the way we build the product. What does the
            user want to see, what do they want to do when they see it.&lt;span&gt;&amp;nbsp;
            &lt;/span&gt;Obviously you can’t just throw this together – there’s some sketching and
            ideas and research about what we can/can’t do. I dug up the fruits of our very first
            ideas meeting.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
&lt;img src="/blogbits/Nigel_Morse/respdes.jpg"&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Dom doesn’t write code – instead
            he mocks things up in Visio (he doesn’t even feel the need to be constrained by
            Visual Studio’s UI designer!). Every dialog is constructed, discussed as to what
            is actually possible and can be implemented before the heat death of the universe
            and refined.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Then we have to actually
            cut some code.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;b&gt;&lt;span&gt;
            &lt;span&gt;Implement&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;At first it was Dan and myself on
            the coding. Dan was also project manager but he left Red Gate sometime after our
            initial beta having helped with the re-design. David then came aboard and took over
            from Dan as project manager/coder and also Daniel joined as well (a different Dan/Daniel
            obviously!).&lt;span&gt;&amp;nbsp; &lt;/span&gt;As far as coding goes
            that’s pretty much of muchness I guess – it’s what all software companies do which
            is why there is so much software out there. The problem is that I think a lot of
            places just do the cutting code and ship the result, or pay merely lip service to
            the other parts.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Here, however, Dom
            remained involved throughout as new issues came out to tweak or even redesign parts
            and to make sure each dialog was just the right shade of pink.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Here also there was another stark
            difference to previous jobs.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Our technical
            author (Brian) was already involved.&lt;span&gt;&amp;nbsp; &lt;/span&gt;
            Rather than being asked to just knock up some documentation at the end of the release
            cycle he was already going over the designs and early builds making sure that what
            we wrote was not only English (another of my failings) but hopefully understandable
            by users rather than just by the developers. We have terminology documents to make
            sure the language is consistent and pretty much any text in the product has come
            from Brian. This means he also has a good understanding of the product and is able
            to put the interactive help in the right places and write actually helpful online
            documentation.
            &lt;o:p&gt;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;b&gt;&lt;span&gt;
            &lt;span&gt;Testing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;However… by far the biggest change
            and for me the best one is the testing.&lt;span&gt;&amp;nbsp; &lt;/span&gt;
            Almost as soon as the first code hit the build server and a build came out, Jason
            was all over it. &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;To get this kind of feedback so
            early was a revelation as it means that someone is essentially looking over your
            shoulder and pointing out your errors straight away. The benefit of this is enormous
            because the earlier on you can find the issue, the earlier you can fix it and the
            easier it is to modify the structure and design of code if necessary.&lt;span&gt;&amp;nbsp;
            &lt;/span&gt;This is far better then finding it several months later when you discover
            that one thing you either didn’t realise or plain forgot about means you have to
            rip out and refactor your code. Of course by that point there’s no time or it’s
            just too painful to do that so you hack round the problem. Catching the issues early
            is so much less painful.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;After a month or two Priya also
            joined in testing and then they would start to tag-team you. One would open a bug,
            you’d “fix” it and then the other would come back with some extra small detail and
            you had to “fix” it again&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Obviously when coding you try to
            think of edge cases early on and plan to handle them, you might even write test
            cases to make sure.&lt;span&gt;&amp;nbsp; &lt;/span&gt;However it’s still
            you thinking about the same problem.&lt;span&gt;&amp;nbsp; &lt;/span&gt;
            The testers aren’t you and they come at things with a different perspective.&lt;span&gt;&amp;nbsp; &lt;/span&gt;They can see a whole world of cases
            you don’t think about, they have access to several versions of Windows and SQL server
            and they use every synapse to bring your code to its knees.
            &lt;o:p&gt;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;It’s painful but you know it makes
            sense and it changes the way you code. You start to think not only how you would
            usually, but also how to outwit the testers, how will they test this and how can
            I deny them opening an issue.&lt;span&gt;&amp;nbsp; &lt;/span&gt;You don’t
            just &lt;i&gt;think&lt;/i&gt; of corner cases but you make
            sure you &lt;i&gt;handle&lt;/i&gt; them right now and do
            the bit of extra work just to avoid seeing the look of glee of the their face as
            their mouse heads towards the “Create new issue” button.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Ultimately it’s a battle you will
            lose because there’s always something they can find.&lt;span&gt;&amp;nbsp;
            &lt;/span&gt;You can at least try to make it hard and laugh at their desperation when
            all they have left is to ask you to add a period character to some text or just
            align this label 1 pixel to the left but you still fix them because, although it
            hurts, on the inside you know they are right.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Jason and Priya have to put up with
            a lot, from me at least. I joke that my first response to any bug is simply to close
            it and see how many actually come back (sometimes it’s even true). Sometimes I’ll
            close it saying “that’s as designed – there’s no way we can change that” and I know
            that if they call me over to “discuss” it that I’ll end up fixing it somehow because
            they’ll think of a way it can be done. I’ll argue anyway because at least it distracts
            them from finding other issues and you can’t let them have it to easy.&lt;span&gt;&amp;nbsp;
            &lt;/span&gt;
            &lt;o:p&gt;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;So whilst this battle continues
            with thrust and parry, ultimately you’re on the same side trying to write a product
            that people actually want and like to use (which is probably why the tester nearly
            always wins).&lt;span&gt;&amp;nbsp; &lt;/span&gt;The team works with testers
            and developers in a symbiosis with new features being tested early and retested
            often for regressions.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I’ve said to
            Jason that I couldn’t do his job and he made the same claim about mine, but working
            closely together we hopefully get the best out of both of use and hopefully that
            reflects in the product.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Thanks to all the team.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
&lt;img src="/blogbits/Nigel_Morse/team_500.jpg"&gt;&lt;/p&gt;
    &lt;p&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;Clockwise from back left: David
            (project manager/developer), Claire (marketing), Dom (designer), Helen (manager),
            Colin (product manager), Brian (technical author), Daniel (developer), Nigel (developer),
            Priya (tester), Eddie (support champion).&lt;span&gt;&amp;nbsp; &lt;/span&gt;
            Not in the photo: Jason (tester) – he’s afraid making images of him will divest
            him of his supreme ability to find bugs or something.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
    &lt;p class="MsoNormal"&gt;
        &lt;span&gt;
            &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
        &lt;/span&gt;
    &lt;/p&gt;&lt;p class="MsoNormal"&gt;
        &lt;span&gt;So I hope you get to try out SQL
            Response and I hope you like it.&lt;span&gt;&amp;nbsp; There is a &lt;a href="http://www.red-gate.com/MessageBoard/viewtopic.php?t=7575"&gt;release candidate&lt;/a&gt; out right now and a &lt;a href="https://www.surveymk.com/s.aspx?sm=a5DD8lPtXHXB3SFZgG0VTA_3d_3d"&gt;survey&lt;/a&gt; you fill in to win a $100 Amazon voucher.&amp;nbsp; &lt;/span&gt;I’ll
            be heading for a beer or several very soon.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.simple-talk.com/community/aggbug.aspx?PostID=69500" width="1" height="1"&gt;</description></item><item><title>Anonymous delegates rock</title><link>http://www.simple-talk.com/community/blogs/nigel_morse/archive/2008/03/18/45384.aspx</link><pubDate>Tue, 18 Mar 2008 23:33:00 GMT</pubDate><guid isPermaLink="false">f46e5dea-70cd-4a69-a7e1-fd07a313bd4d:45384</guid><dc:creator>Nigel Morse</dc:creator><slash:comments>1</slash:comments><comments>http://www.simple-talk.com/community/blogs/nigel_morse/comments/45384.aspx</comments><wfw:commentRss>http://www.simple-talk.com/community/blogs/nigel_morse/commentrss.aspx?PostID=45384</wfw:commentRss><description>I'm finding I really like C#'s anonymous delegates. I've used them several times now in various ways. Normal delegates are already a Good Thing, however basically they are C(++) function pointers with a much nicer syntax. Anonymous delegates do clever things like having the ability to access local variables.&amp;nbsp; This just provides some syntactic sugar and the compiler under the hood creates classes to hold the variables and puts the anonymous method on that class.&amp;nbsp; Take a look with a decompiler and you can see what gets generated.&lt;br&gt;&lt;br&gt;One "obvious" pattern I've seen people here come up with independently is to invoke something on a worker thread from a UI thread, or the other way round (and sometimes both by nesting one delegate inside another). &lt;br&gt;&lt;br&gt;However another use I like is what I want to share today. &lt;br&gt;&lt;br&gt;I've been using WMI a bit recently. WMI can be used (amongst other things) to get information about remote computers.&amp;nbsp; I won't go into the detail here - there's plenty on the web about it (http://en.wikipedia.org/wiki/Windows_Management_Instrumentation).&amp;nbsp; I may even do a blog myself on it one day.&lt;br&gt;&lt;br&gt;To access WMI via .NET you use the System.Management namespace.&amp;nbsp; There are various ways to call and get the information, but a common example is to run a query in a SQL-esque way - e.g. "select TotalPhysicalMemory&amp;nbsp; from Win32_ComputerSystem" will get you the total physical memory on a machine.&amp;nbsp; However to run a query like this requires quite verbose code, not least because a lot of objects you create need Dispose()ing of afterwards.&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span&gt;&lt;br&gt;ManagementScope&amp;nbsp;scope&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementScope&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;"\\\\mymachinename\\root\\cimv2"&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&lt;/span&gt;&lt;span&gt;scope.Connect&lt;/span&gt;&lt;span&gt;();
&lt;br&gt;&lt;/span&gt;&lt;span&gt;objQry&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ObjectQuery&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;"select&amp;nbsp;TotalPhysicalMemory&amp;nbsp;from&amp;nbsp;Win32_ComputerSystem"&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&lt;/span&gt;&lt;span&gt;UInt64&amp;nbsp;totalMemory&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;
&lt;br&gt;&lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectSearcher&amp;nbsp;searcher&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectSearcher&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;,&amp;nbsp;
&lt;br&gt;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectCollection&amp;nbsp;collection&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;searcher.Get&lt;/span&gt;&lt;span&gt;()&amp;nbsp;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObject&amp;nbsp;obj&amp;nbsp;&lt;/span&gt;&lt;span&gt;in&amp;nbsp;&lt;/span&gt;&lt;span&gt;collection&amp;nbsp;&lt;/span&gt;&lt;span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;totalMemory&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;obj["TotalMemory"]&lt;/span&gt;&lt;span&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;obj.Dispose&lt;/span&gt;&lt;span&gt;();
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;}
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br&gt;}
&lt;br&gt;
&lt;/span&gt;&lt;/code&gt;&lt;br&gt;So great - i've got that out, but I want to find out how much free disk it has as well.&amp;nbsp; This query is "select Name,FreeSpace from Win32_LogicalDisk where DriveType=3" and could well return me more than one disk. (DriveType=3 means physical disks on this machine as opposed to mapped network drives etc.)&lt;br&gt;&lt;br&gt;I can reuse the scope so the extra code is...&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span&gt;objQry&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ObjectQuery&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;"select&amp;nbsp;Name,FreeSpace&amp;nbsp;from&amp;nbsp;Win32_LogicalDisk&amp;nbsp;where&amp;nbsp;DriveType=3"&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&lt;/span&gt;&lt;span&gt;Dictionary&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;drives&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;Dictionary&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;&amp;gt;();
&lt;br&gt;&lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectSearcher&amp;nbsp;searcher&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectSearcher&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;,&amp;nbsp;
&lt;br&gt;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectCollection&amp;nbsp;collection&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;searcher.Get&lt;/span&gt;&lt;span&gt;()&amp;nbsp;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObject&amp;nbsp;obj&amp;nbsp;&lt;/span&gt;&lt;span&gt;in&amp;nbsp;&lt;/span&gt;&lt;span&gt;collection&amp;nbsp;&lt;/span&gt;&lt;span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drives.add&lt;/span&gt;&lt;span&gt;(&amp;nbsp;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;obj["Name"]&lt;/span&gt;&lt;span&gt;,&amp;nbsp;(&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;obj["FreeSpace"]&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;obj.Dispose&lt;/span&gt;&lt;span&gt;();
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;}
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br&gt;}
&lt;br&gt;
&lt;/span&gt;&lt;/code&gt;&lt;br&gt;But that instantly offends me - I have 13 lines of code, of which 10 are the same as above.&amp;nbsp; That's 10 lines repeated whenever I want to run another query.&lt;br&gt;&lt;br&gt;Instead I can define a method like this:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span&gt;private&amp;nbsp;delegate&amp;nbsp;void&amp;nbsp;&lt;/span&gt;&lt;span&gt;UseManagementObject&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObject&amp;nbsp;obj&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;span&gt;private&amp;nbsp;static&amp;nbsp;void&amp;nbsp;&lt;/span&gt;&lt;span&gt;DoWmiQuery&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementScope&amp;nbsp;scope&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;string&amp;nbsp;&lt;/span&gt;&lt;span&gt;qry&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;UseManagementObject&amp;nbsp;callback&amp;nbsp;&lt;/span&gt;&lt;span&gt;)
&lt;br&gt;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ObjectQuery&amp;nbsp;objQry&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ObjectQuery&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;qry&amp;nbsp;&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectSearcher&amp;nbsp;searcher&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectSearcher&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;objQry&amp;nbsp;&lt;/span&gt;&lt;span&gt;)&amp;nbsp;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObjectCollection&amp;nbsp;collection&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;searcher.Get&lt;/span&gt;&lt;span&gt;()&amp;nbsp;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObject&amp;nbsp;obj&amp;nbsp;&lt;/span&gt;&lt;span&gt;in&amp;nbsp;&lt;/span&gt;&lt;span&gt;collection&amp;nbsp;&lt;/span&gt;&lt;span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;callback&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;obj&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;obj.Dispose&lt;/span&gt;&lt;span&gt;();
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;}
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Now I can reduce my 2 previous pieces to this:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span&gt;ManagementScope&amp;nbsp;scope&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementScope&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;"\\\\mymachinename\\root\\cimv2"&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&lt;/span&gt;&lt;span&gt;scope.Connect&lt;/span&gt;&lt;span&gt;();
&lt;br&gt;&lt;/span&gt;&lt;span&gt;UInt64&amp;nbsp;totalMemory&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;
&lt;br&gt;&lt;/span&gt;&lt;span&gt;DoWMiQuery&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;"select&amp;nbsp;TotalPhysicalMemory&amp;nbsp;from&amp;nbsp;Win32_ComputerSystem"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObject&amp;nbsp;obj&amp;nbsp;&lt;/span&gt;&lt;span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;totalMemory&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;obj["TotalMemory"]&lt;/span&gt;&lt;span&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;span&gt;Dictionary&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;drives&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;Dictionary&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;&amp;gt;();
&lt;br&gt;&lt;/span&gt;&lt;span&gt;DoWMiQuery&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;"select&amp;nbsp;Name,FreeSpace&amp;nbsp;from&amp;nbsp;Win32_LogicalDisk&amp;nbsp;where&amp;nbsp;DriveType=3"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;ManagementObject&amp;nbsp;obj&amp;nbsp;&lt;/span&gt;&lt;span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drives.add&lt;/span&gt;&lt;span&gt;(&amp;nbsp;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;obj["Name"]&lt;/span&gt;&lt;span&gt;,&amp;nbsp;(&lt;/span&gt;&lt;span&gt;UInt64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;obj["FreeSpace"]&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;span&gt;);
&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;Jobs a good'un :)  &lt;br&gt;&lt;br&gt;&lt;img src="http://www.simple-talk.com/community/aggbug.aspx?PostID=45384" width="1" height="1"&gt;</description></item><item><title>Do you yield?</title><link>http://www.simple-talk.com/community/blogs/nigel_morse/archive/2007/10/31/38945.aspx</link><pubDate>Wed, 31 Oct 2007 20:30:00 GMT</pubDate><guid isPermaLink="false">f46e5dea-70cd-4a69-a7e1-fd07a313bd4d:38945</guid><dc:creator>Nigel Morse</dc:creator><slash:comments>1</slash:comments><comments>http://www.simple-talk.com/community/blogs/nigel_morse/comments/38945.aspx</comments><wfw:commentRss>http://www.simple-talk.com/community/blogs/nigel_morse/commentrss.aspx?PostID=38945</wfw:commentRss><description>&lt;P&gt;Yay! I’ve actually used the C# yield statement for the first time. I’ve wanted to use it ever since I read about it, but never really had a use for it until today. &lt;/P&gt;
&lt;P&gt;I was writing some code to read a SQL Server error log and eventually found an undocumented stored procedure &lt;STRONG&gt;sp_readerrorlog&lt;/STRONG&gt; (amazing how so much useful stuff for SQL Server seems to be “undocumented”).&lt;/P&gt;
&lt;P&gt;This procedure works on 2000 and 2005 and returns the entire current error log. However, (probably partly due to its undocumented nature) the different versions return the results in a different format. I need to look for things in the log so my first thought was to create a Parse2000Log and a Parse2005Log and then have these call a 3&lt;SUP&gt;rd&lt;/SUP&gt; method (e.g. ParseLogLine) for each line. The problem with this was that the messages can span multiple lines. For example if you do a &lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=blue&gt;RAISERROR&lt;/FONT&gt;&lt;FONT color=gray&gt;(&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=red&gt;'foo'&lt;/FONT&gt;&lt;FONT color=gray&gt;,&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;20&lt;/FONT&gt;&lt;FONT color=gray&gt;,&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;1&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=gray&gt;)&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;WITH&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=magenta&gt;LOG&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt; 
&lt;P&gt;the&amp;nbsp;log&amp;nbsp;shows.&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#ff0000&gt;2007-10-30&amp;nbsp;15:11:36.07&amp;nbsp;spid52&amp;nbsp;&amp;nbsp;Error:&amp;nbsp;50000,&amp;nbsp;Severity:&amp;nbsp;20,&amp;nbsp;State:&amp;nbsp;1&lt;BR&gt;2007-10-30&amp;nbsp;15:11:36.07&amp;nbsp;spid52&amp;nbsp;&amp;nbsp;foo.&lt;/FONT&gt;&amp;nbsp; &lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;This would mean I need to keep state in my ParseLogLine function to track which line I expect next, which means I’d need to make some class variables which I’d really rather avoid. &amp;nbsp; I’m more in favour of using local stack variables when I can. &amp;nbsp; Obviously there are numerous ways to skin this (as with most) cats, but then I hit on the idea of using yield to provide an enumerator over the results and hand back a struct for each line to a calling function. &amp;nbsp; This means I can separate out the differences between the servers into 2 functions but call them from a common function that can act on the actual message. &lt;/P&gt;
&lt;P&gt;The 2005 function is by far the simpler as it 2005 has pre-parsed the log into separate columns:&lt;/P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;// Struct to hold a line of the logfile&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt; &lt;FONT color=blue&gt;private&lt;/FONT&gt; &lt;FONT color=blue&gt;struct&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;LogLine&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;public&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;DateTime&lt;/FONT&gt; date;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;public&lt;/FONT&gt; &lt;FONT color=blue&gt;string&lt;/FONT&gt; processInfo;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;public&lt;/FONT&gt; &lt;FONT color=blue&gt;string&lt;/FONT&gt; message;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;private&lt;/FONT&gt; &lt;FONT color=blue&gt;static&lt;/FONT&gt; IEnumerable &amp;lt;LogLine&amp;gt; Parse2005Log&amp;nbsp; SqlDataReader reader )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LogLine ret;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;while&lt;/FONT&gt;( reader.Read() )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret.date = reader.GetDateTime( 0 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.processInfo = reader.GetString( 1 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.message = reader.IsDBNull( 2 ) ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String.Empty : reader.GetString( 2 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;yield&lt;/FONT&gt; &lt;FONT color=blue&gt;return&lt;/FONT&gt; ret;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;And there is the yield in action. What actually happens is that the compiler generates a class for you which (in this case) inherits from &lt;STRONG&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/STRONG&gt; and&lt;STRONG&gt;IEnumerator&amp;lt;T&amp;gt;&lt;/STRONG&gt; and has the methods necessary. This means you only have to write one method and not the whole class which I think makes for neat solution in this case. &amp;nbsp; You can make the method return &lt;STRONG&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/STRONG&gt; or&lt;STRONG&gt;IEnumerator&amp;lt;T&amp;gt;&lt;/STRONG&gt; (or the non-generic variants if you really want) and it will work it out. &amp;nbsp; Here I chose &lt;STRONG&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/STRONG&gt; so I can use it in a foreach statement &lt;/P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerable&amp;lt;LogLine&amp;gt; logreader;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;if&lt;/FONT&gt;( s_is2005Server )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logreader = Parse2005Log( reader );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;else&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logreader = Parse2000Log( reader );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;foreach&lt;/FONT&gt;( LogLine line &lt;FONT color=blue&gt;in&lt;/FONT&gt; logreader )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine( &lt;FONT color=#a31515&gt;"{0} : {1} : {2}"&lt;/FONT&gt;, line.date,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; line.processInfo, line.message );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;Here’s the full example: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=blue&gt;private&lt;/FONT&gt; &lt;FONT color=blue&gt;struct&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;LogLine&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;public&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;DateTime&lt;/FONT&gt; date;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;public&lt;/FONT&gt; &lt;FONT color=blue&gt;string&lt;/FONT&gt; processInfo;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;public&lt;/FONT&gt; &lt;FONT color=blue&gt;string&lt;/FONT&gt; message;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;static&lt;/FONT&gt; &lt;FONT color=blue&gt;void&lt;/FONT&gt; Main(&lt;FONT color=blue&gt;string&lt;/FONT&gt;[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af&gt;SqlConnectionStringBuilder&lt;/FONT&gt; builder = &lt;FONT color=blue&gt;new&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;SqlConnectionStringBuilder&lt;/FONT&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; builder.DataSource = s_machineName;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; builder.IntegratedSecurity = &lt;FONT color=blue&gt;true&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;string&lt;/FONT&gt; connStr = builder.ConnectionString;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;try&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;using&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;SqlConnection&lt;/FONT&gt; conn = &lt;FONT color=blue&gt;new&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;SqlConnection&lt;/FONT&gt;(connStr))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;using&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;SqlCommand&lt;/FONT&gt; comm = conn.CreateCommand())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; comm.CommandType = &lt;FONT color=#2b91af&gt;CommandType&lt;/FONT&gt;.StoredProcedure;&lt;BR&gt;&amp;nbsp; &lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;comm.CommandText = &lt;FONT color=#a31515&gt;"sp_readerrorlog"&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af&gt;SqlDataReader&lt;/FONT&gt; reader = comm.ExecuteReader();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af&gt;IEnumerable&lt;/FONT&gt;&amp;lt;&lt;FONT color=#2b91af&gt;LogLine&lt;/FONT&gt;&amp;gt; logreader;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;if&lt;/FONT&gt; (s_is2005Server)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;logreader = Parse2005Log(reader);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;else&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logreader = Parse2000Log(reader);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;foreach&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;LogLine&lt;/FONT&gt; line &lt;FONT color=blue&gt;in&lt;/FONT&gt; logreader)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af&gt;Console&lt;/FONT&gt;.WriteLine(&lt;FONT color=#a31515&gt;"{0} : {1} : {2}"&lt;/FONT&gt;, line.date,&lt;BR&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; line.processInfo, line.message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;catch&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;SqlException&lt;/FONT&gt; ex)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#2b91af&gt;Console&lt;/FONT&gt;.WriteLine(&lt;FONT color=#a31515&gt;"Exceptional! - "&lt;/FONT&gt; + ex.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;private&lt;/FONT&gt; &lt;FONT color=blue&gt;static&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;IEnumerable&lt;/FONT&gt;&amp;lt;&lt;FONT color=#2b91af&gt;LogLine&lt;/FONT&gt;&amp;gt; Parse2000Log(&lt;FONT color=#2b91af&gt;SqlDataReader&lt;/FONT&gt; reader)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af&gt;LogLine&lt;/FONT&gt; ret;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;while&lt;/FONT&gt; (reader.Read())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=blue&gt;if&lt;/FONT&gt; (!reader.IsDBNull(0))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;string&lt;/FONT&gt; line = reader.GetString(0);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;// The format of the SQL 2000 log file is fairly&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;// contstrained to be a fixed length&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;// date, then fixed length process info field and then&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;// the message.&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;//&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;// .. or it can just be freeform&lt;BR&gt;&lt;/FONT&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;string&lt;/FONT&gt; maybedate = line.Substring(0, 22);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af&gt;DateTime&lt;/FONT&gt; date;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;if&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;DateTime&lt;/FONT&gt;.TryParse(maybedate,&lt;BR&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;FONT color=#2b91af&gt;CultureInfo&lt;/FONT&gt;.InvariantCulture,&lt;BR&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;FONT color=#2b91af&gt;DateTimeStyles&lt;/FONT&gt;.AssumeLocal,&lt;BR&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;FONT color=blue&gt;out&lt;/FONT&gt; date)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp; !line.StartsWith(&lt;FONT color=#a31515&gt;"\t"&lt;/FONT&gt;))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.date = date;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.processInfo = line.Substring(23, 7).TrimEnd();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.message = line.Substring(33).TrimEnd();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;else&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.date = &lt;FONT color=#2b91af&gt;DateTime&lt;/FONT&gt;.MinValue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.processInfo = &lt;FONT color=blue&gt;string&lt;/FONT&gt;.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.message = line;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;FONT color=blue&gt;yield&lt;/FONT&gt; &lt;FONT color=blue&gt;return&lt;/FONT&gt; ret;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;private&lt;/FONT&gt; &lt;FONT color=blue&gt;static&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;IEnumerable&lt;/FONT&gt;&amp;lt;&lt;FONT color=#2b91af&gt;LogLine&lt;/FONT&gt;&amp;gt; Parse2005Log(&lt;FONT color=#2b91af&gt;SqlDataReader&lt;/FONT&gt; reader)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af&gt;LogLine&lt;/FONT&gt; ret;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;while&lt;/FONT&gt; (reader.Read())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.date = reader.GetDateTime(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.processInfo = reader.GetString(1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.message = reader.IsDBNull(2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ? &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.Empty : reader.GetString(2);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;yield&lt;/FONT&gt; &lt;FONT color=blue&gt;return&lt;/FONT&gt; ret;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://www.simple-talk.com/community/aggbug.aspx?PostID=38945" width="1" height="1"&gt;</description></item></channel></rss>