<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://harthill-it.co.uk" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Hart Hill IT RSS Feed</title>
 <link>http://harthill-it.co.uk/rss</link>
 <description>RSS feed of all blog articles</description>
 <language>en</language>
<item>
 <title>Wireless Router Security</title>
 <link>http://harthill-it.co.uk/wirelessroutersetup</link>
 <description>&lt;p&gt;One of the most common questions we are asked is, &amp;ldquo;How do I know my home PC is secure?&amp;rdquo; There is no simple answer, rather a checkpoint list of things to tick off.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/wirelessroutersetup&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/wirelessroutersetup#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/13">Wireless Security</category>
 <pubDate>Thu, 14 Feb 2008 10:10:23 -0500</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">9 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Addressing Structures</title>
 <link>http://harthill-it.co.uk/datamodelling/addressing-structures</link>
 <description>&lt;p&gt;Addresses are one of the best examples of granularity - an address can be a single &amp;quot;blob&amp;quot; suitable for printing on envelopes, or it can be highly detailed, with every line independently accessible.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/datamodelling/addressing-structures&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/datamodelling/addressing-structures#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/7">Data Modelling</category>
 <pubDate>Tue, 29 Jan 2008 16:06:25 -0500</pubDate>
 <dc:creator>steve_uk</dc:creator>
 <guid isPermaLink="false">2 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Dynamic SQL</title>
 <link>http://harthill-it.co.uk/dynamic-sql</link>
 <description>&lt;p&gt;A little while back I was doing a database migration. I was running on our development servers and once I was ready to deploy I needed to be able to change the server name from dev-sql1 to sql1 or whatever they were called.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/dynamic-sql&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/dynamic-sql#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/10">TSQL</category>
 <pubDate>Wed, 30 Jan 2008 19:12:44 -0500</pubDate>
 <dc:creator>steve_uk</dc:creator>
 <guid isPermaLink="false">6 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Collapsible boxes like on the new BBC web site</title>
 <link>http://harthill-it.co.uk/node/17</link>
 <description>&lt;p&gt;I was very taken with the new BBC web site. One of the features that really impressed me was the collapsible boxes. Click on the title bar and the content rolls down, click again and it rolls back up. Very smoothly also.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/node/17&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/node/17#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/19">Web development</category>
 <pubDate>Mon, 03 Mar 2008 07:09:40 -0500</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">17 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Temporal Shift</title>
 <link>http://harthill-it.co.uk/datamodelling/temporalshift</link>
 <description>&lt;p&gt;One of the most common &amp;ldquo;design patterns&amp;rdquo; in data modelling is the temporal shift. It is basically used for historical data, but is not limited to this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/datamodelling/temporalshift&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/datamodelling/temporalshift#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/7">Data Modelling</category>
 <pubDate>Fri, 07 Mar 2008 09:14:37 -0500</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">19 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Anti virus, anti spyware and what else?</title>
 <link>http://harthill-it.co.uk/pcsecurity</link>
 <description>&lt;p&gt;Does it seem to you that protecting your PC from nasties such as viruses, spyware, adware and the like has got more complicated? Well you&amp;rsquo;d be right.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/pcsecurity&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/pcsecurity#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/20">PC Security</category>
 <pubDate>Fri, 14 Mar 2008 08:18:14 -0400</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">21 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Not all cards support WPA2</title>
 <link>http://harthill-it.co.uk/node/22</link>
 <description>&lt;p&gt;&lt;b&gt;Cheap wireless PC cards &amp;ndash; a false economy?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/node/22&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/node/22#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/13">Wireless Security</category>
 <pubDate>Tue, 29 Apr 2008 07:03:48 -0400</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">22 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>The sting in the tail of any development project</title>
 <link>http://harthill-it.co.uk//blog/industry/data+migration</link>
 <description>&lt;p&gt;Probably one of the most overlooked aspects of any IT project is data migration. You have designed and built a new and improved business system, citing improvements in efficiency, reporting, reliability and so forth. The new data model is a work of art, this is something the development team can be proud of. All you need to do now is get the data from the legacy system or systems, and a myriad well loved and maintained spreadsheets that came into being by frustrated end users creating them to overcome constraints in the old system.&lt;/p&gt;
&lt;p&gt;IT is one of the few industries where we work with intangibles. While a proof of concept can convey ideas, screen layouts and wireframes can give stakeholders an idea of how something is shaping up, just how do you communicate the effort required to migrate the data. Why is it that the data migration piece is left until the end of the project, and then the delivery date starts to slip and slip while the enormity of the task starts to dawn on the poor encumbent burdened with the task of migrating the data.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you are reading this from an informed stand point, where these pitfalls do not befall your projects I would encourage you to read on as you might pick up some gem, or new approach you had not considered. Failing that, you might be able to post constructive comments to add value to the article. If, however you are reading this while being in the situation depicted earlier, then despair not. Help is at hand and I would hope that you could draw from this article the ammunition you need to pitch a reasoned argument to the stakeholders and confidently and knowledgably take control of the situation. Should you be at the planning phase of a new development, or IT systems merge and have not given the data migration piece the respect it deserves then this is your Damascus moment.&lt;/p&gt;
&lt;p&gt;Right up front you should have decided whether the data migration is worth taking on. If you are replacing a system with a comparatively small number of records, say from a CRM database, the complexity of the new data model may make the migration prohibitively expensive, and it may be cheaper to hire some data entry clerks and hand tap the data into the new system via the new GUI prior to &amp;quot;go live&amp;quot;.&lt;/p&gt;
&lt;p&gt;Also, you should consider how the legacy systems will be replaced. Is this a big bang, or are you parallel running? In the case of big bang, how can you revert to using the old system without data loss should the need arise? Is this a viable option?&amp;nbsp;In the case of parallel running, which is essentially one big bang migration followed by frequent loads of &amp;quot;changed&amp;quot; data, known as delta loads (delta meaning change). What triggers these delta loads? Is it a batch process, or does it happen in real time? There are of course pros and cons to each approach, and this is a decision that only you and your organisation can make.&lt;/p&gt;
&lt;p&gt;Firstly let us state the objectives of the data migration. Usually it goes something like this : &lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;quot;To migrate&amp;nbsp;relevant data&amp;nbsp;from the legacy data stores where possible, and to create exception reports in the event of records which failed to migrate. To provide metrics on the success and failure rates of the migration attempt&amp;quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;and in the event of parallel running&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;quot;To migrate the data from the legacy data stores at a point in time, and then make subsequent delta loads&amp;quot;&lt;/b&gt;
&lt;p&gt;Usually the big bang approach always wins, as the immediate costs of the extra coding and testing effort to successfully implement the parallel running is deemed to high. I say usually. There might be some logical business reason where parallel running is imperative, such as in a public sector or banking organisation where data corruption would have legal consequences.&lt;/p&gt;
&lt;p&gt;So the next question is, or at least should be, what percentage of correctly migrated data constitues an acceptable level? By making compromises here, timescales can be shortened. This is your greatest tool so use it wisely. If 90% can be delivered at a relatively low cost, then how much more effort is it to automate the remaining 10%. Is it worth it? Back to the data entry clerk scenario again.&lt;/p&gt;
&lt;p&gt;Care should be taken to quantify the amount of effort from the customer required to meet these deadlines. After all, it is their data and they should take responsibility for it. Resource will need to be provided to clean existing records, monitor progress with the migration and sample migrated records to check for inconsistencies. Steps can and should be taken to begin the cleansing process way before any development work gets underway. Typical sources of bad data would include :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Duplicate records&lt;/li&gt;
&lt;li&gt;Bad data, eg incorrectly formed addresses, bank account numbers etc.&lt;/li&gt;
&lt;li&gt;Conflicting data&lt;/li&gt;
&lt;li&gt;Implied data.&amp;nbsp;Ie Special characters only known to the end users are added to fields to give special meaning to a record, usually to cope with business needs that have arisen since the system was implemented.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While some degree of automation can be used to cleanse this bad data, it is again to be within agreed confidence levels taking into account the risk of getting it wrong. More importantly it requires a high degree of human input from the customer, the level of which will diminish over time as the quality of the data is improved. Software is available for doing partial address matching, bank account number verification and so forth. The value of this software is not short lived as it can be used in the new system to ensure the data is validated at point of entry. Let&#039;s face it, if the data structures were designed correctly and proper validation in place in the legacy system it would be a much easier task, and the lifespan of the system more than likely increased.&lt;/p&gt;
&lt;p&gt;Knowing that the quality of the data can be improved by partially automated processes and human interaction, surely the sooner this task is started the better for all concerned. Imagine if data analysis was performed as part of the project analysis phase, and work had been going on in background to clean up the data while the development work was being carried out, how much simpler the migration task would be. This is why the migration piece should never be left to the last minute. Any argument that you need to know where you are migrating to before you can even start looking at this is erroneous. To coin the phrase &amp;quot;garbage in, garbage out&amp;quot;. If the legacy data is of a poor quality, then in the worst case the new system will not accept it, or if it does it will exist in the new system and be just as bad so what value have you really added to the business?&lt;/p&gt;
&lt;p&gt;&lt;b&gt;So what are the stages of a data migration?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The industry recognised acronym for this type of work&amp;nbsp;is ETL (Extract, Transform, Load). So the data is extracted from the legacy system or systems, is transformed to fit the new system and is then loaded into the new system. I think this acronym doesnt fit the model in this case. It should be :&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ECCL&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extract&lt;/li&gt;
&lt;li&gt;Cleanse&lt;/li&gt;
&lt;li&gt;Conform&lt;/li&gt;
&lt;li&gt;Load&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before we do any migrating we would want to build in some meta data. This meta data will describe the migration, the migration steps, outcomes and metrics which will be very called upon for reporting to the business at a later stage.&lt;/p&gt;
&lt;h2&gt;The Migration Meta Data&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_1.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Migration attempt meta data&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Extract&lt;/p&gt;
&lt;p&gt;The first stage is where an extract of the data is taken from the legacy system, and given a date and time stamp. This is the data we will attempt to migrate in this iteration. Any migration effort should be able to go through multiple iterations to cater for power outages and delta loads for example. On the next iteration, a new extract is performed and given a new date and time stamp. This step is important. It is the first time in the process when the data becomes &lt;b&gt;your problem&lt;/b&gt;. What would happen if the new system had incorrect data with potentially costly implications, and yet in the legacy system the data was correct? Could the data have been corrected in the legacy system &lt;b&gt;AFTER&lt;/b&gt; the migration? You get the point. This stage should have 100 percent success as it is literally a bulk copy of all the data in the legacy system, with the key constraints&amp;nbsp;removed but the key data included. Typically the extract tables have the same name as the legacy database and table, prefixed with EXT to denote it is an&amp;nbsp;extract table. Eg EXT_DBCRM_Customers represents an extract&amp;nbsp;table called Customers from the DBCRM database. It should have the same structure as the legacy table, but with all constraints removed. Addtionally a date and time stamp should be added to the end of the table to denote when the extract occured.&lt;/p&gt;
&lt;p&gt;At this point it would be useful to point out that some meta data would be useful, particularly as we are dealing with multiple data stores, and multiple iterations. In particular we want to record the event, any useful metric information and of course date and time information.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_3.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_4.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cleanse&lt;/p&gt;
&lt;p&gt;As mentioned before, ideally the data should be cleansed at source to keep the number of records appearing in the exceptions reports to a minimum. That does not mean however that this data is to be trusted, far from it.&amp;nbsp;The data will still need to go through strict validation rules before it proceeds to the next stage, where it is trusted enought to be conformed for loading into the new system.&lt;/p&gt;
&lt;p&gt;This validation is the heaviest part of the migration process, and you will find that for each migration run you do (there will be many as you are developing and tuning the migration code) that machine time has a significant part to play. Often it is the case that the migration test server is an elderly machine nearing end of life, whereas this is really a false economy. There will innevitably be many migration &amp;quot;dress rehearsals&amp;quot; before the big performance, so cost cutting here really is a false economy, while the whole&amp;nbsp;BI team twiddle their thumbs waiting for the end result of the most recent migration attempt. Also it may well be worth putting the effort into producing a &amp;quot;cut down&amp;quot; version of the legacy data store for the first phase of development. This obviously gives you a fairly blinkered view of any data quality issues, and any migration strategy that works for the same hundred or so rows each time will get a nasty surpise when the whole data store is pushed through. The legacy data may be in such a state of disarray that producing a cut down version would be cost prohibitive in itself, and a nice fast server with a few terrabytes of disk space would be the cheaper option. I said terrabytes because&amp;nbsp;for each iteration, you are taking a snapshot of the legacy data, loading it into validation (cleansing) and conforming stages so you can monitor the effects of code changes across multiple iterations. This all eats space, and lots of it so there is no point in scrimping here.&lt;/p&gt;
&lt;p&gt;The extracting, cleansing, confirming&amp;nbsp;processes will require to run scripts to do the work. The order these scripts are run in will be of importance&amp;nbsp;and also &amp;nbsp;the outcome of each script. This takes us back to our meta data requirements. There needs to be some meta data to descripe the scripts, record the outcomes and govern the sequence in which the scripts are executed.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_5.png&quot; /&gt; &lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_6.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Conform&lt;/p&gt;
&lt;p&gt;So now our data is cleansed, and trusted we are ready to conform the data. This is possibly the most complicated part of the process. As part of the analysis phase of the migration you should have conducted a gap analysis the results of which will be invaluable at this point. The structure of the data is currently still as per the old schema, and it is in this phase that we start to think of the new structure and start to prepare our data for loading into the new system.&lt;/p&gt;
&lt;p&gt;The steps to be conducted in this phase include :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conforming structure ie splitting records out into child tables where necessary&lt;/li&gt;
&lt;li&gt;Converting key values ie using the List of values&lt;/li&gt;
&lt;li&gt;Deriving data to fill gaps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;List of values&lt;/p&gt;
&lt;p&gt;This is one of the most useful tools in any data migration. Every look up table in the old system is mapped to the look up tables in the new system. This should alert you to the fact that look up data should be loaded into the new system before the migration takes place. This is the starting point database and should be prepared along with the list of values before the migration takes place. The list of values should live in the staging database and is used to conform key lookup data as the data passes through&amp;nbsp;this stage.&lt;/p&gt;
&lt;p&gt;Taking the customer details scenario a step further to illustrate the point, lets say that each customer record (which also holds the address information) has a look up value, to denote the type of address. The values that can be stored are :&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Legacy address types&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_7.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_8.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The NEW_KEY field denotes the&amp;nbsp;new value in the new database. For information the new Address_Type table could look like&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_9.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So in the new database the address type is numeric, and not an alpha character. Also there is no address type for &amp;quot;Home&amp;quot;. Using the list of values table for all lookups in this way greatly simplifies the effort to conform the data and prevents lots on unneccessary hard coding in the conform scripts. Obviously any records extracted from the legacy system that contain values that are not in the list of values are sent to the exceptions report and this can then be used in the next iteration to improved the success rate of the migration.&lt;/p&gt;
&lt;p&gt;Load&lt;/p&gt;
&lt;p&gt;Once the data has been through cleansing and conforming it is ready to be loaded into the new system. At this point in the proceedings there are mainly three things to consider.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The order in which to load the data&lt;/li&gt;
&lt;li&gt;Surrogate keys&lt;/li&gt;
&lt;li&gt;Exceptions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The order the data is loaded will be governed by the procedure meta data, so this is not of concern. It should be noted though that the order in which the procedures will run must be given thought, and a look at the new schema should tell you all you need to know so I will not labour the point here.&lt;/p&gt;
&lt;p&gt;Surrogate keys&lt;/p&gt;
&lt;p&gt;For every data item that lives in the old schema, there should be a key value. In this case it will be the id of the customer record. There will be a customer record created in the new system and this in turn will have its own id, probably not the same one. So&amp;nbsp;we need a way of tying the two keys together, and this is where surrogate keys come in.&lt;/p&gt;
&lt;p&gt;Consider the following table structure&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;/files/images/data_migration_fig_10.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This tells us that the customer id 57 in the&amp;nbsp;old system is now represented by the key value 10 in the new system. The surrogate key 1 represents this relationship.&lt;/p&gt;
&lt;p&gt;By representing the relationship between the legacy and&amp;nbsp;new records in this way it allows&amp;nbsp;us to tie back to the old system and answer (or defend yourself against) the inevitable question of &amp;quot;This customer was right in the old system, it can&#039;t have migrated across properly&amp;quot;. You can see what data was extracted, how it was cleansed, conformed and loaded and the hard facts speak for themselves.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk//blog/industry/data+migration&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk//blog/industry/data+migration#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/22">Data Migration</category>
 <pubDate>Tue, 17 Mar 2009 15:59:03 -0400</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">39 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Empty or null dates in Metastorm BPM</title>
 <link>http://harthill-it.co.uk//blog/industry/metastormnulldates</link>
 <description>&lt;p&gt;I recently came across a problem with inserting rows into a SQL database table from within a Metastorm procedure. The problem was that even if a date was not entered into the date picker, and in spite of using a stored procedure, the date would always end up in the database as 01&lt;sup&gt;st&lt;/sup&gt; January 1900.&lt;/p&gt;
&lt;p&gt;If from a SQL Query window you type&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;geshifilter&quot;&gt;&lt;code class=&quot;geshifilter-tsql&quot;&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;CAST&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&#039;&#039;&lt;/span&gt; &lt;span style=&quot;color: #0000FF;&quot;&gt;AS&lt;/span&gt; &lt;span style=&quot;color: #0000FF;&quot;&gt;DATETIME&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You get&lt;/p&gt;
&lt;p&gt;1900-01-01 00:00:00.000&lt;/p&gt;
&lt;p&gt;So this means that the date picker must be passing a string to the stored procedure.&lt;/p&gt;
&lt;p&gt;After doing a SQL trace, sure enough the values passed to the DATETIME parameter of the stored procedure was N&#039;&#039;&lt;/p&gt;
&lt;p&gt;The stored procedure had declared the DATETIME parameter as&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;geshifilter&quot;&gt;&lt;code class=&quot;geshifilter-tsql&quot;&gt;myDateTime &lt;span style=&quot;color: #0000FF;&quot;&gt;DATETIME&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;NULL&lt;/span&gt; &lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So it already defaults to NULL, but Metastorm passes an empty string, which is unsurprising considering the date picker stores the date in an html text box.&lt;/p&gt;
&lt;p&gt;The simple workaround is inside the stored procedure to check for the date being passed in as empty string and to set it to NULL.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;geshifilter&quot;&gt;&lt;code class=&quot;geshifilter-tsql&quot;&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;IF&lt;/span&gt; @myDateTime&lt;span style=&quot;color: #808080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&#039;&#039;&lt;/span&gt; &lt;span style=&quot;color: #0000FF;&quot;&gt;SET&lt;/span&gt; @myDateTime &lt;span style=&quot;color: #808080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;NULL&lt;/span&gt; &lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk//blog/industry/metastormnulldates&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk//blog/industry/metastormnulldates#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/23">Metastorm BPM</category>
 <pubDate>Tue, 07 Apr 2009 04:49:31 -0400</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">40 at http://harthill-it.co.uk</guid>
</item>
<item>
 <title>Read exchange rates from Google</title>
 <link>http://harthill-it.co.uk/node/41</link>
 <description>&lt;p&gt;Example code to retrieve an exchange rate from Google in C#.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;using System.IO;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;using System.Net;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;namespace fx_lookup&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static string _statusCode;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static string _statusDescription;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static int _errorCount;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const string URL = &amp;quot;http://finance.yahoo.com/d/quotes.csv?s={0}{1}=X&amp;amp;f=a&amp;amp;e=.txt&amp;quot;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //LookupCurrency currencyRate = new LookupCurrency();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Decimal exchangeRate = GetExchangeRate(&amp;quot;USD&amp;quot;, &amp;quot;GBP&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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(&amp;quot;The exchange rate for USD to GBP is : &amp;quot; + exchangeRate.ToString());&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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(&amp;quot;Press any key to end&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static decimal GetExchangeRate(string fromCurrencyCode, string toCurrencyCode)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; decimal exchangeRate = 0.0m;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string url = string.Format(URL, fromCurrencyCode, toCurrencyCode);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uri uri = new Uri(url);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string content = FetchPage(uri);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Numeric.IsNumber(content, out exchangeRate);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exchangeRate = Decimal.Parse(content);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return exchangeRate;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static string FetchPage(Uri uri)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string content = null;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebResponse response = null;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // Create a request for this uri&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; WebRequest request = WebRequest.Create(uri);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; IWebProxy proxy = request.Proxy;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; proxy.Credentials = CredentialCache.DefaultCredentials;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; request.Proxy = proxy;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // First we only want to ge the HEADER to determine the type of resource at this url&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; request.Method = &amp;quot;HEAD&amp;quot;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // Fetch the response&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; response = request.GetResponse();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; if (response is HttpWebResponse)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; _statusCode = ((HttpWebResponse)response).StatusCode.ToString();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; _statusDescription = ((HttpWebResponse)response).StatusDescription;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; if (_statusCode.Equals(&amp;quot;OK&amp;quot;))&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // read the headers&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; WebHeaderCollection headers = response.Headers;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // get the content type&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; string contentType = headers[&amp;quot;Content-type&amp;quot;];&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // If HTML, we will read the content&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; if (contentType.StartsWith(&amp;quot;application/octet-stream&amp;quot;))&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // Fetch full content&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; request = WebRequest.Create(uri);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; // Fetch the response&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; response = request.GetResponse();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; if (response is HttpWebResponse)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; _statusCode = ((HttpWebResponse)response).StatusCode.ToString();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; _statusDescription = ((HttpWebResponse)response).StatusDescription;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; if (_statusCode.Equals(&amp;quot;OK&amp;quot;))&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; StreamReader sr = new StreamReader(response.GetResponseStream());&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; content = sr.ReadToEnd();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; else&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; _errorCount++;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; else&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; _errorCount++;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; System.Diagnostics.Debug.WriteLine(ex.ToString());&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; _errorCount++;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; if (response != null)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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; response.Close();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return content;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://harthill-it.co.uk/node/41&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://harthill-it.co.uk/node/41#comments</comments>
 <category domain="http://harthill-it.co.uk/taxonomy/term/24">C#</category>
 <pubDate>Wed, 08 Apr 2009 10:04:51 -0400</pubDate>
 <dc:creator>charlie</dc:creator>
 <guid isPermaLink="false">41 at http://harthill-it.co.uk</guid>
</item>
</channel>
</rss>
