<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Nigel Morse</title><subtitle type="html" /><id>http://www.simple-talk.com/community/blogs/nigel_morse/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.simple-talk.com/community/blogs/nigel_morse/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.simple-talk.com/community/blogs/nigel_morse/atom.aspx" /><generator uri="http://communityserver.org" version="2.0.60217.2664">Community Server</generator><updated>2007-10-31T15:30:00Z</updated><entry><title>Anonymous delegates rock</title><link rel="alternate" type="text/html" href="http://www.simple-talk.com/community/blogs/nigel_morse/archive/2008/03/18/45384.aspx" /><id>http://www.simple-talk.com/community/blogs/nigel_morse/archive/2008/03/18/45384.aspx</id><published>2008-03-18T17:33:00Z</published><updated>2008-03-18T17:33:00Z</updated><content type="html">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;</content><author><name>Nigel Morse</name><uri>http://www.simple-talk.com/community/user/Profile.aspx?UserID=9747</uri></author></entry><entry><title>Do you yield?</title><link rel="alternate" type="text/html" href="http://www.simple-talk.com/community/blogs/nigel_morse/archive/2007/10/31/38945.aspx" /><id>http://www.simple-talk.com/community/blogs/nigel_morse/archive/2007/10/31/38945.aspx</id><published>2007-10-31T14:30:00Z</published><updated>2007-10-31T14:30:00Z</updated><content type="html">&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;</content><author><name>Nigel Morse</name><uri>http://www.simple-talk.com/community/user/Profile.aspx?UserID=9747</uri></author></entry></feed>