<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblogcasts.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Sparks from the Anvil</title><link>http://sqlblogcasts.com/blogs/drjohn/default.aspx</link><description>Applied business intelligence</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>SSAS Stored Procedures - connecting to the transactional data source</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2008/04/23/ssas-stored-procedures-connecting-to-the-transactional-data-source.aspx</link><pubDate>Wed, 23 Apr 2008 13:17:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:10348</guid><dc:creator>DrJohn</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=10348</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2008/04/23/ssas-stored-procedures-connecting-to-the-transactional-data-source.aspx#comments</comments><description>&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:Arial;"&gt;There are often circumstances where an SSAS stored procedure needs to connect to the transactional database to perform a query.&amp;nbsp; This is certainly the case in a near-real-time OLAP solution where the cube sits directly on top of the application database and dynamic dimension security is implemented by a stored proc. Here the SSAS stored procedure has to query the transactional database in order to get the user&amp;#39;s authorisation. Clearly the SSAS database has a data source and it uses this connection to process the cube. So how do we get the connection string? &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Well the short code snippet below provides the solution. The code simply connects back to the current database using AMO and obtains the connection string from the data source object. It then removes the redundant &amp;quot;&lt;span style="FONT-SIZE:10pt;COLOR:#a31515;FONT-FAMILY:Courier New;"&gt;Provider=SQLNCLI.1;&lt;/span&gt;&amp;quot; before returning a valid SQL connection string that can be used by &lt;span style="FONT-SIZE:10pt;COLOR:#2b91af;FONT-FAMILY:Courier New;"&gt;SqlConnection&lt;/span&gt;(). &lt;/p&gt;
&lt;p&gt;Of course, you must provide your stored proc assembly with the &amp;quot;Unrestricted&amp;quot; permission set and set its impersonation mode to &amp;quot;Service Account&amp;quot; for the connection string to work. &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; AMO = Microsoft.AnalysisServices; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; Microsoft.AnalysisServices.AdomdServer; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;...&lt;span style="COLOR:gray;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;summary&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; Obtains the SqlConnection string used by the OLAP database &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/summary&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:gray;"&gt;///&lt;/span&gt;&lt;span style="COLOR:green;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; GetSqlConnectionString() &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;{ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:green;"&gt;// connect to the current instance of Analysis Services and return the transactional data source &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AMO.&lt;span style="COLOR:#2b91af;"&gt;Server&lt;/span&gt; svr = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; AMO.&lt;span style="COLOR:#2b91af;"&gt;Server&lt;/span&gt;(); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;svr.Connect(&lt;span style="COLOR:#a31515;"&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Data Source=&amp;quot; &lt;font size="2"&gt;+ &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Context&lt;/font&gt;&lt;font size="2"&gt;.CurrentServerID + &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;;Initial Catalog=&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; + &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Context&lt;/font&gt;&lt;font size="2"&gt;.CurrentDatabaseName&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:green;"&gt;// get the connection to the transactional database from the OLAP connection manager &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; connStr = svr.Databases.GetByName(&lt;span style="COLOR:#2b91af;"&gt;Context&lt;/span&gt;.CurrentDatabaseName).DataSources[0].ConnectionString.Replace(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Provider=SQLNCLI.1;&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;svr.Disconnect(); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; (connStr); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=10348" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/SSAS/default.aspx">SSAS</category><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>The FACT is that it is not so DIM after all</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2008/04/22/the-fact-is-it-is-not-so-dim-after-all.aspx</link><pubDate>Tue, 22 Apr 2008 05:13:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:10341</guid><dc:creator>DrJohn</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=10341</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2008/04/22/the-fact-is-it-is-not-so-dim-after-all.aspx#comments</comments><description>&lt;p&gt;I have always looked down upon the Fact and Dim prefixes applied to the tables within the AdventureWorksDW database with derision. &amp;quot;Why,&amp;quot; I asked myself, &amp;quot;would anyone feel the need to use such prefixes? Clearly this is BI for dummies.&amp;quot; Given that most BI projects use a nice clean, dedicated data warehouse database where all the tables are imported into the cube, perhaps my derision was justified. &lt;/p&gt;
&lt;p&gt;However, in my current project I have been building a near-real-time OLAP solution directly on top of an application database. Of course, to isolate the cube from potential schema changes, I created an abstraction layer in the form of a set of views. However, as the project has progressed and the large team of developers has created more and more database objects, it has become increasingly difficult to find the views created for the cube among the debris. &lt;/p&gt;
&lt;p&gt;I recently had to re-build the entire cube from scratch due to a bug caused by reverting to a previous version in source control. Of course, I took the opportunity to consolidate all my T-SQL code into a few files and adopt a consistent naming convention for all my views. So what naming convention did I adopt? Well Fact and Dim of course! Why? Well because anyone following on from my work who is half-familiar with the BI sample databases will immediately recognise the relevance. &lt;/p&gt;
&lt;p&gt;I subsequently found out the big benefit of adopting this convention – it makes creating a DSV much, much easier! A quick search for all objects containing &amp;#39;Fact&amp;#39; and &amp;#39;Dim&amp;#39; soon had my new DSV populated with all the relevant objects. &lt;/p&gt;
&lt;p&gt;So the &lt;strong&gt;Fact&lt;/strong&gt; is that this practice is not so &lt;strong&gt;Dim &lt;/strong&gt;after all! &lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=10341" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/SSAS/default.aspx">SSAS</category></item><item><title>SSAS: Working with date and time measures to calculate average elapse time</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2007/12/03/ssas-working-with-date-and-time-measures-to-calculate-average-elapse-time.aspx</link><pubDate>Mon, 03 Dec 2007 22:09:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:5154</guid><dc:creator>DrJohn</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=5154</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2007/12/03/ssas-working-with-date-and-time-measures-to-calculate-average-elapse-time.aspx#comments</comments><description>&lt;P&gt;There are some things in the life that are so implicit and taken for granted that nobody ever bothers to tell you about them or write up any documentation. This is how I feel the implicit support for date and time measures must have come about in Microsoft SQL Server 2005 Analysis Services (SSAS). Certainly I could not find any documentation about the topic and yet intriguingly both Measures and Calculated Members have "Simple Date" and "Simple Time" in their drop down list of possible text formats. &lt;/P&gt;
&lt;P&gt;Clearly SSAS will allow you to add attributes to a dimension that have the data type DateTime. However, SSAS does not allow you to create a measure based on DateTime data type. Now this is a bit of a drawback when you want to calculate the average time a process took, which is exactly what I needed to do. After searching the internet, I was none the wiser as to how to solve the problem so some experimentation was in order. &lt;/P&gt;
&lt;P&gt;An obvious approach would be to create a measure which contains the elapse time for the process in minutes. This would certainly give the right answer when averaged. However, presenting the resulting number in a format that was meaningful to the end-user is beyond standard out-of-the-box functionality. Especially when the elapse time needs to be presented in financial speak such as T+1 15:30 (i.e. the next day at 3:30pm). And since the end-user would be browsing the cube with Excel 2007, standard out-of-the-box functionality is all I could use. &lt;/P&gt;
&lt;P&gt;My data was pretty simple: &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;SPAN style="COLOR:blue;"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;TABLE&lt;/SPAN&gt; dbo&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;WhenEventHappened&lt;SPAN style="COLOR:gray;"&gt;( &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;SurrogateKey &lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NOT&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NULL, &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;MeasurementTypeID &lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NOT&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NULL, &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;ReferenceDate&lt;SPAN style="COLOR:blue;"&gt; datetime&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NOT&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NULL, &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;DateTimeEventHappened &lt;SPAN style="COLOR:blue;"&gt;datetime&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NOT&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NULL &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;ON&lt;/SPAN&gt; [PRIMARY] &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Where&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt; ReferenceDate&lt;/SPAN&gt; holds the date the event is relative to and&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt; DateTimeEventHappened &lt;/SPAN&gt;clearly holds the date &amp;amp; time when the event took place. So for example, if we use the financial services analogy the trade took place on the &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;ReferenceDate&lt;/SPAN&gt; and it was settled on &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;DateTimeEventHappened&lt;/SPAN&gt;. So the elapse time is &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;(DateTimeEventHappened – ReferenceDate)&lt;/SPAN&gt; in days, hours and minutes. In my data, &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;ReferenceDate&lt;/SPAN&gt; is always a date with no time element. &lt;/P&gt;
&lt;H2&gt;The SQL Server DateTime data type&lt;/H2&gt;
&lt;P&gt;You probably know that behind the scenes SQL Server holds dates as a decimal number. The whole number contains the number of days since 1900 and the fraction represents the date. For example, &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;39415.5 &lt;/SPAN&gt;represents 2007-12-01 12:00:00 &lt;/P&gt;
&lt;P&gt;So, if &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;ReferenceDate&lt;/SPAN&gt;= 2007-12-01 00:00:00 &lt;/P&gt;
&lt;P&gt;and &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;DateTimeEventHappened=&lt;/SPAN&gt;2007-12-01 12:00:00 &lt;/P&gt;
&lt;P&gt;then &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;(DateTimeEventHappened – ReferenceDate)=&lt;/SPAN&gt; &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;1900-01-01 12:00:00&lt;/SPAN&gt; which is held as &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;0.5 &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;OK so this gives me the elapse time, but now do I get it into the cube? Well the answer is simple. Convert the DateTime into a decimal number. To do this you need to apply the relevant cast/convert such as: &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;CONVERT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;float&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;A&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;DateTimeEventHappened &lt;SPAN style="COLOR:gray;"&gt;-&lt;/SPAN&gt; A&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;ReferenceDate&lt;SPAN style="COLOR:gray;"&gt;))&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; EventDateDiffDecimal&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;To import this data into the cube, I created a view that performed the relevant cast/converts. &lt;/P&gt;
&lt;P&gt;&lt;IMG title="SQL View" src="http://www.boviltd.talktalk.net/images/DateTimeMeasures/01_SQLView.jpg"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Now, for illustration of what happens between SQL and SSAS, I have added some redundant columns to my view just to make it obvious what is really going on here. So here is my data, including the extra &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;&lt;A class="" title=OLE_LINK1 name=OLE_LINK1&gt;&lt;/A&gt;ReferenceDateDecimal &lt;/SPAN&gt;and&lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt; DateTimeEventHappenedDecimal&lt;/SPAN&gt; columns.&amp;nbsp; I have also created some simple data which is shown below:&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG title="SQL Data" alt="SQL Data" src="http://www.boviltd.talktalk.net/images/DateTimeMeasures/02_SQLData.jpg"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Next I simply added this new view to the cube's Data Source View and added the &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;EventTimeDecimal&lt;/SPAN&gt; and &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;EventDateDiffDecimal&lt;/SPAN&gt; plus the extra columns to my example cube as a new measure group which automatically sets the AggregateFunction to Sum. So here is the result: &lt;/P&gt;
&lt;P&gt;&lt;IMG title="Cube Measures" alt="Cube Measures" src="http://www.boviltd.talktalk.net/images/DateTimeMeasures/03_CubeData.jpg"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;H2&gt;Now apply magic! &lt;/H2&gt;
&lt;P&gt;OK, so the above is not so useful, so let's apply some magic. Simply set the FormatString and AggregateFunction for each measure as follows: &lt;/P&gt;
&lt;DIV&gt;
&lt;TABLE class=MsoTableLightShadingAccent1 style="BORDER-RIGHT:medium none;BORDER-TOP:medium none;BORDER-LEFT:medium none;BORDER-BOTTOM:medium none;BORDER-COLLAPSE:collapse;" cellSpacing=0 cellPadding=0 class="MsoTableLightShadingAccent1"&gt;

&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:184.3pt;PADDING-TOP:0cm;BORDER-BOTTOM:1pt solid;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;B&gt;&lt;SPAN&gt;Column&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:134.65pt;PADDING-TOP:0cm;BORDER-BOTTOM:1pt solid;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;B&gt;&lt;SPAN&gt;Format String&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:127.6pt;PADDING-TOP:0cm;BORDER-BOTTOM:1pt solid;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;B&gt;&lt;SPAN&gt;AggregateFunction&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:184.3pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;Reference Date Decimal&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:134.65pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;dd-mmm-yyyy&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:127.6pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;AverageOfChildren&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:184.3pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;Date Time Event Happened Decimal &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:134.65pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;dd-mmm-yyyy hh:mm&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:127.6pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;AverageOfChildren&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:184.3pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;Event Time Decimal&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:134.65pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;hh:mm&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:127.6pt;PADDING-TOP:0cm;BORDER-BOTTOM:medium none;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;AverageOfChildren&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:184.3pt;PADDING-TOP:0cm;BORDER-BOTTOM:1pt solid;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;Event Date Diff Decimal&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:134.65pt;PADDING-TOP:0cm;BORDER-BOTTOM:1pt solid;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;dd-mmm-yyyy hh:mm&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0cm;BORDER-LEFT:medium none;WIDTH:127.6pt;PADDING-TOP:0cm;BORDER-BOTTOM:1pt solid;" vAlign=top&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM:0pt;"&gt;&lt;SPAN&gt;AverageOfChildren&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;So after re-deploying the cube, we get: &lt;/P&gt;
&lt;P&gt;&lt;IMG title="Formatted Cube Data" alt="Formatted Cube Data" src="http://www.boviltd.talktalk.net/images/DateTimeMeasures/04_CubeDataFormatted.jpg"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Oh look, wrong dates! &lt;/H2&gt;
&lt;P&gt;Well we have dates, but not the correct ones! It seems that date zero in SQL Server is 01-Jan-1990 and date zero in SSAS is 30-Dec-1899! To fix the problem, we simply add two to the values provided by our &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;EventElapsePeriod&lt;/SPAN&gt; view. After processing the cube we now get the correct dates: &lt;/P&gt;
&lt;P&gt;&lt;IMG title="Cube dates plus 2" alt="Cube dates plus 2" src="http://www.boviltd.talktalk.net/images/DateTimeMeasures/06_CubeDataPlus2.jpg"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;However, I want the &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;EventDateDiffDecimal&lt;/SPAN&gt; to be presented in the format T+1 15:30. So I need to subtract one from the &lt;SPAN style="FONT-SIZE:10pt;FONT-FAMILY:Courier New;"&gt;EventDateDiffDecimal&lt;/SPAN&gt; value so that I get 1-Jan as my date. Then I can format the value, ignoring the month and year using the FormatString "\T\+d hh:mm". Now purist among you may point out that this strategy will not work when the date gets bigger than 31 as it will flick over T+1 again. This is true, but I have defined EventDateDiffDecimal as a semi-additive measure so I will not hit this problem. &lt;/P&gt;
&lt;P&gt;So here is the final formatted data: &lt;/P&gt;
&lt;P&gt;&lt;IMG title=CubeDateTPlus1 alt=CubeDateTPlus1 src="http://www.boviltd.talktalk.net/images/DateTimeMeasures/07_CubeDataTPlus.jpg"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Note how the Grand Total is correctly calculated. Just magic!&lt;/P&gt;
&lt;P&gt;If you would like to try this for yourself, I have published the &lt;A href="http://www.boviltd.talktalk.net/downloads/DateTimeMeasures.zip"&gt;T-SQL scripts and cube for download here&lt;/A&gt;.&amp;nbsp; Note that the ZIP file also contains the SQL script to re-create the sample table and view used in this article.&lt;/P&gt;
&lt;P&gt;Good Luck!&lt;/P&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=5154" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/SSAS/default.aspx">SSAS</category></item><item><title>Cleaning Address Data with SSIS using a Web Service - Explained</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/18/cleaning-address-data-with-ssis-using-a-web-service-explained.aspx</link><pubDate>Sun, 18 Nov 2007 18:27:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:4243</guid><dc:creator>DrJohn</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=4243</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/18/cleaning-address-data-with-ssis-using-a-web-service-explained.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.conchango.com/jamiethomson/"&gt;Jamie Thompson&lt;/a&gt; gave me some very helpful feedback on my recently published article over at SQLCentral.com called &lt;a href="http://www.sqlservercentral.com/links/504593/12260"&gt;&lt;b&gt;Cleaning Address Data with SSIS Using a Web Service&lt;/b&gt;&lt;/a&gt; and my previous blog entry on &lt;a href="http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/03/ssis-calling-sharepoint-web-services-from-the-data-flow.aspx"&gt;Calling SharePoint web services from the data flow&lt;/a&gt;.   Jamie pointed out that I had assumed my audience would be fully familiar with the .NET framework and terms such as &lt;b&gt;WSDL&lt;/b&gt; and &lt;b&gt;Proxy Class&lt;/b&gt; need further explanation.  So here is my attempt to clarify some issues he pointed out. 
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;WSDL&lt;/b&gt;&lt;br&gt;WSDL is short for &lt;b&gt;Web Service Description Language&lt;/b&gt; and is the definition of what the web service provides and how it can be invoked.  A &lt;b&gt;WSDL document&lt;/b&gt; is an XML file which lists all the methods provided by the web service and their parameters.   The &lt;b&gt;WSDL document&lt;/b&gt; is returned by a web service when "?wsdl" is appended to the web service's URL (e.g. &lt;a href="http://services.postcodeanywhere.co.uk/uk/lookup.asmx?wsdl"&gt;http://services.postcodeanywhere.co.uk/uk/lookup.asmx?wsdl&lt;/a&gt;).  
&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Proxy Class &lt;br&gt;&lt;/b&gt;A proxy class simplifies the interaction between your application and a web service.  The .NET Framework provides a command-line utility called &lt;b&gt;wsdl.exe&lt;/b&gt; which generates the code for a proxy class automatically.  In Visual Studio, the &lt;b&gt;Add Web Reference &lt;/b&gt;command automatically executes &lt;b&gt;wsdl.exe&lt;/b&gt; and generated the proxy class for you.  However, with SSIS you need to create a proxy class manually using a command-line such as this:&lt;br&gt;e.g. &lt;br&gt;&lt;b&gt;wsdl /language:VB http://services.postcodeanywhere.co.uk/uk/lookup.asmx?wsdl /out:c:\PostcodeAnywhere.vb
&lt;/b&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;GAC &lt;br&gt;&lt;/b&gt;The &lt;b&gt;Global Assembly Cache&lt;/b&gt; (GAC) is the central repository for sharing assemblies (DLLs).  In order to register an assembly in the GAC, it must be strong named (i.e. must have a unique hash value, public key, locale and version number).&lt;b&gt;
			&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to know more about the .NET Framework, then read &lt;a href="http://www.oreilly.com/catalog/dotnetfrmess3/"&gt;O'Reilly's .NET Framework Essentials&lt;/a&gt;, 3&lt;sup&gt;rd&lt;/sup&gt; Edition.&amp;nbsp;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=4243" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/.NET/default.aspx">.NET</category><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/Web+Service/default.aspx">Web Service</category></item><item><title>SSIS: Getting data from Excel files using Aspose.Cells</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/11/ssis-getting-data-from-excel-files-using-aspose-cells.aspx</link><pubDate>Sun, 11 Nov 2007 15:16:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:3662</guid><dc:creator>DrJohn</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=3662</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/11/ssis-getting-data-from-excel-files-using-aspose-cells.aspx#comments</comments><description>
&lt;p&gt;Excel spreadsheets with complicated layouts really do not lend themselves to processing with the standard Microsoft OLE DB drivers.  Indeed, extracting one or two cells from different worksheets can be positively painful!  This is where the power and flexibility of Aspose.Cells comes into its own.
&lt;/p&gt;
&lt;p&gt;Aspose.Cells provides an API that looks very similar to the OLE automation API exposed by Excel in the Office InterOp assemblies.  However, you do not get all the headaches normally associated with the InterOp assemblies (i.e. modal dialogs, memory leaks, multiple Excel instances etc. etc.).   With Aspose.Cells you do not need Excel to be installed on your server.  Instead you only need a single assembly (Aspose.Cells.dll ) and the accompanying license file (Aspose.Cells.lic).  Simple! 
&lt;/p&gt;
&lt;h2&gt;Working with Aspose.Cells in SSIS
&lt;/h2&gt;
&lt;p&gt;To work with Aspose.Cells, you need to use the Script Task or Script Component.  My personal preference is to use the Script Component in its asynchronous transformation mode.  This way I can feed in a list of Workbooks that I want the component to process on its input buffer and the component can write the data read from the Workbooks onto multiple output buffers (one buffer for each type of data).  
&lt;/p&gt;
&lt;p&gt;As SSIS uses Visual Studio for Applications (VSA), you do not have the flexible "&lt;i&gt;Add Reference&lt;/i&gt;" dialog found in Visual Studio.  In order to get around this issue while you are developing, you need to copy the Aspose.Cells assembly and associated license file into your .NET folder, which is usually:
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Restart Visual Studio and you will see Aspose.Cells listed on VSA's "&lt;i&gt;Add Reference&lt;/i&gt;" dialog.  Now you can add the appropriate "imports" statement to the top of your module and start coding.  Easy!
&lt;/p&gt;
&lt;p&gt;Later, when you move to production, you will need to register the Aspose.Cells assembly in the GAC by simply dropping the assembly into the following folder:
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;C:\WINDOWS\assembly&lt;/span&gt;
	&lt;/p&gt;
&lt;h2&gt;Dealing with the Aspose.Cells License file
&lt;/h2&gt;
&lt;p&gt;Aspose.Cells has a license file which can either be in the same directory as the assembly, or in your own location.  The easiest way to handle this in SSIS is to use a File Connection Manager which records the location of the license file.  Then in code, you will need to add:
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; license &lt;span style="color:blue;"&gt;As&lt;/span&gt; Aspose.Cells.License = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Aspose.Cells.License()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;license.SetLicense(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Connections.AsposeCellsLicense.ConnectionString)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Example Code
&lt;/h2&gt;
&lt;p&gt;My sample code reads a list of workbooks from the input buffer and writes the extracted data to the output buffer.&amp;nbsp; The data flow is shown below along with the code from my asynchronous Script Component. Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.boviltd.talktalk.net/images/aspose_cells_data_flow.jpg" title="Aspose.Cells Script Component in the Data Flow" alt="Aspose.Cells Script Component in the Data Flow" height="419" width="314"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:green;font-family:Courier New;font-size:10pt;"&gt;' Aspose.Cells.dll must be registered in the GAC for production
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:green;font-family:Courier New;font-size:10pt;"&gt;'    AND the C:\WINNT\Microsoft.NET\Framework\v2.0.50727 for development
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:green;font-family:Courier New;font-size:10pt;"&gt;' standard libraries
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Data
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Math
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; Microsoft.SqlServer.Dts.Pipeline.Wrapper
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; Microsoft.SqlServer.Dts.Runtime.Wrapper
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:green;font-family:Courier New;font-size:10pt;"&gt;' additional libraries
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.IO
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Collections.Generic
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; Aspose.Cells
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Class&lt;/span&gt; ScriptMain
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; UserComponent
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Overrides&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub&lt;/span&gt; WorkbookList_ProcessInputRow(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Row &lt;span style="color:blue;"&gt;As&lt;/span&gt; WorkbookListBuffer)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:green;"&gt;' Imports all data from the the Excel workbooks provided on the input
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:green;"&gt;' Note that each workbook contains several worksheets.  
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:green;"&gt;' For efficiency, we open the workbook once and then 
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:green;"&gt;' process all the worksheets in the file
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:green;"&gt;' The previous step in the package downloaded the workbook.
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; fInfo &lt;span style="color:blue;"&gt;As&lt;/span&gt; FileInfo = &lt;span style="color:blue;"&gt;New&lt;/span&gt; FileInfo(Path.Combine(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Variables.ImportFolder, Row.URL))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; fInfo.Exists &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:green;"&gt;' Set Aspose.Cells license 
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; license &lt;span style="color:blue;"&gt;As&lt;/span&gt; Aspose.Cells.License = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Aspose.Cells.License()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            license.SetLicense(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Connections.AsposeCellsLicense.ConnectionString)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:green;"&gt;' Open the workbook
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; wrkBook &lt;span style="color:blue;"&gt;As&lt;/span&gt; Workbook = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Workbook()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                wrkBook.Open(fInfo.FullName)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:green;"&gt;' process each worksheet
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;For&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Each&lt;/span&gt; wrkSheet &lt;span style="color:blue;"&gt;As&lt;/span&gt; Worksheet &lt;span style="color:blue;"&gt;In&lt;/span&gt; wrkBook.Worksheets
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:green;"&gt;' Check we have a valid worksheet by testing 
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:green;font-family:Courier New;font-size:10pt;"&gt;                        ' for text prompts in specific locations
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;If&lt;/span&gt; ValidWorksheetLayout(wrkSheet) &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            &lt;span style="color:green;"&gt;' process each worksheet found in the workbook 
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:green;font-family:Courier New;font-size:10pt;"&gt;                            ' that has the correct format
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            ImportWorksheetData(Row.WorkbookID, wrkSheet, Row)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; exi &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireInformation(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"WorkbookList_ProcessInputRow: Invalid Worksheet Layout: "&lt;/span&gt; &amp;amp; wrkSheet.Name, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Next
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Else
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"WorkbookList_ProcessInputRow: Missing Excel File: "&lt;/span&gt; &amp;amp; fInfo.FullName, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"WorkbookList_ProcessInputRow: "&lt;/span&gt; &amp;amp; ex.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Function&lt;/span&gt; ValidWorksheetLayout(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; wrkSheet &lt;span style="color:blue;"&gt;As&lt;/span&gt; Worksheet) &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Boolean
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:green;"&gt;' checks if data is in expected locations.  If not, then return false.
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;If&lt;/span&gt; wrkSheet.Cells(&lt;span&gt;"B3"&lt;/span&gt;).Value.ToString = &lt;span&gt;"Profit and loss projections"&lt;/span&gt;
			&lt;span style="color:blue;"&gt;And&lt;/span&gt; wrkSheet.Cells(&lt;span&gt;"B14"&lt;/span&gt;).Value.ToString = &lt;span&gt;"Revenue"&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt;
			&lt;span style="color:blue;"&gt;True
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt;
			&lt;span style="color:blue;"&gt;False
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Function
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub&lt;/span&gt; ImportWorksheetData(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; WorkbookID &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; wrkSheet &lt;span style="color:blue;"&gt;As&lt;/span&gt; Worksheet, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Row &lt;span style="color:blue;"&gt;As&lt;/span&gt; WorkbookListBuffer)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:green;"&gt;' imports all data from the worksheet
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; iRow &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; iCol &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; iCount &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; dataRange &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataTable
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; dr &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataTableReader
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; HeaderRow &lt;span style="color:blue;"&gt;As&lt;/span&gt; List(&lt;span style="color:blue;"&gt;Of&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:green;"&gt;' heading row is in seperate location to data, so import heading first
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:green;"&gt;' note that Aspose.Cells uses zero-based row and column numbers in ExportDataTable call
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:green;"&gt;' so Cell=4,Row=12 is actually cell E13
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:green;"&gt;' read single header row into generic list
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                HeaderRow = &lt;span style="color:blue;"&gt;New&lt;/span&gt; List(&lt;span style="color:blue;"&gt;Of&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dataRange = wrkSheet.Cells.ExportDataTable(12, 4, 1, 5)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dr = dataRange.CreateDataReader()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;If&lt;/span&gt; dr.Read &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;For&lt;/span&gt; iCount = 0 &lt;span style="color:blue;"&gt;To&lt;/span&gt; 4
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        HeaderRow.Add(GetInteger(dr, iCount))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;Next
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex0 &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"ImportWorksheetData ex0: "&lt;/span&gt; &amp;amp; ex0.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dataRange = wrkSheet.Cells.ExportDataTable(14, 2, 2, 7)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dr = dataRange.CreateDataReader()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;While&lt;/span&gt; dr.Read
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    ProcessDataTable(WorkbookID, dr, 2, 6, HeaderRow)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;While
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex1 &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"ImportWorksheetData ex1: "&lt;/span&gt; &amp;amp; ex1.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dataRange = wrkSheet.Cells.ExportDataTable(19, 2, 2, 7)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dr = dataRange.CreateDataReader()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;While&lt;/span&gt; dr.Read
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    ProcessDataTable(WorkbookID, dr, 2, 6, HeaderRow)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;While
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex2 &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"ImportWorksheetData ex2: "&lt;/span&gt; &amp;amp; ex2.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dataRange = wrkSheet.Cells.ExportDataTable(23, 2, 9, 7)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                dr = dataRange.CreateDataReader()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;While&lt;/span&gt; dr.Read
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    ProcessDataTable(WorkbookID, dr, 2, 6, HeaderRow)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;While
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex3 &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"ImportWorksheetData ex3: "&lt;/span&gt; &amp;amp; ex3.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; exOuter &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"ImportWorksheetData: outer "&lt;/span&gt; &amp;amp; exOuter.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub&lt;/span&gt; ProcessDataTable(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; WorkbookID &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; dr &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataTableReader, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; iStartDataCol &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; iDataColCount &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; HeaderRow &lt;span style="color:blue;"&gt;As&lt;/span&gt; List(&lt;span style="color:blue;"&gt;Of&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; iCol &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; DataValue &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Decimal
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; bAddRow &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Boolean
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; TimePeriodID &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; OutputCount &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = 0
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;For&lt;/span&gt; iCol = iStartDataCol &lt;span style="color:blue;"&gt;To&lt;/span&gt; iDataColCount
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                bAddRow = &lt;span style="color:blue;"&gt;False
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;If&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Not&lt;/span&gt; dr.IsDBNull(iCol) &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        DataValue = GetDecimal(dr, iCol)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;If&lt;/span&gt; DataValue &amp;lt;&amp;gt; 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt; bAddRow = &lt;span style="color:blue;"&gt;True
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;If&lt;/span&gt; bAddRow &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            &lt;span style="color:blue;"&gt;With&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.WorksheetDataBuffer
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                                .AddRow()
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                                &lt;span style="color:green;"&gt;' get header from the row we read into a list earlier
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                                .FinancialYear = HeaderRow(iCol - 2)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                                .WorkbookID = WorkbookID
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                                .RowName = dr.GetString(0)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                                .DataValue = DataValue
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;With
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex1 &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"ProcessDataTable: Inner "&lt;/span&gt; &amp;amp; ex1.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Next
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"ProcessDataTable: Outer "&lt;/span&gt; &amp;amp; ex.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetDecimal(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; dr &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataTableReader, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; iCol &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Decimal
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; DataValue &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Decimal
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Select&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Case&lt;/span&gt; dr.GetDataTypeName(iCol)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"String"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;If&lt;/span&gt; IsNumeric(dr.GetString(iCol)) &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        DataValue = &lt;span style="color:blue;"&gt;CDec&lt;/span&gt;(dr.GetString(iCol))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"Integer"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    DataValue = &lt;span style="color:blue;"&gt;CDec&lt;/span&gt;(dr.GetInt32(iCol))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"Double"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    DataValue = &lt;span style="color:blue;"&gt;CDec&lt;/span&gt;(dr.GetDouble(iCol))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"Decimal"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    DataValue = dr.GetDecimal(iCol)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Select
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"GetDecimal "&lt;/span&gt; &amp;amp; ex.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; DataValue
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Function
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetInteger(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; dr &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataTableReader, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; iCol &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; DataValue &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Select&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Case&lt;/span&gt; dr.GetDataTypeName(iCol)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"String"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;If&lt;/span&gt; IsNumeric(dr.GetString(iCol)) &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        DataValue = &lt;span style="color:blue;"&gt;CInt&lt;/span&gt;(dr.GetString(iCol))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"Integer"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    DataValue = dr.GetInt32(iCol)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"Double"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    DataValue = &lt;span style="color:blue;"&gt;CInt&lt;/span&gt;(dr.GetDouble(iCol))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Case&lt;/span&gt;
			&lt;span&gt;"Decimal"
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    DataValue = &lt;span style="color:blue;"&gt;CInt&lt;/span&gt;(dr.GetDecimal(iCol))
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Select
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.FireError(0, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ComponentMetaData.Name, &lt;span&gt;"GetInteger "&lt;/span&gt; &amp;amp; ex.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; DataValue
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Function
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;
	&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=3662" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/Aspose.Cells/default.aspx">Aspose.Cells</category></item><item><title>Downloading Excel files from SharePoint using SSIS</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/04/downloading-excel-files-from-sharepoint-using-ssis.aspx</link><pubDate>Sun, 04 Nov 2007 11:44:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:3402</guid><dc:creator>DrJohn</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=3402</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/04/downloading-excel-files-from-sharepoint-using-ssis.aspx#comments</comments><description>
&lt;p&gt;In my &lt;a href="http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/03/ssis-calling-sharepoint-web-services-from-the-data-flow.aspx"&gt;previous post&lt;/a&gt;, I outlined how to obtain a recursive list of all Excel files held in a SharePoint document library.  In SSIS, I use this code to upsert records into a table which identifies which files are new or modified.  Clearly I could process the file in-situ, but that would over complicate my code with data streams which SSIS would not understand – especially if you are attempting to use the standard Microsoft.Jet.OLEDB.4.0 engine to process the file!   So downloading the file to a local folder is the easiest option.  Fortunately, I spotted &lt;a href="http://blogs.3sharp.com/Blog/grege/archive/2006/07/12/1534.aspx"&gt;Greg Enslow's post&lt;/a&gt; which pointed me in the direction of using the WebClient library.  
&lt;/p&gt;

&lt;p&gt;In my control flow I obtain a list all the files I need to process and store it in an ADO.NET recordset. I then iterate over this list using a ForEach task, which sets various variables containing the URL, file extension and the document's name and it's GUID in SharePoint.  My script task then downloads each file so it can be processed by subsequent tasks in the control flow.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.boviltd.talktalk.net/images/downloading_excel_control_flow.jpg" title="Control Flow" alt="Control Flow" height="246" width="463"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;I have expanded on Greg's original code to support file system locations as well as SharePoint URLs.  Enjoy!
&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Data
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Math
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; Microsoft.SqlServer.Dts.Runtime
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Net
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.IO
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Class&lt;/span&gt; ScriptMain
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Main()
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:green;"&gt;' downloads the file from SharePoint or a file system location to a local folder
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; taskResult &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Integer&lt;/span&gt; = Dts.Results.Success
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:green;"&gt;' obtain location of local folder from variable
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; dir &lt;span style="color:blue;"&gt;As&lt;/span&gt; DirectoryInfo = &lt;span style="color:blue;"&gt;New&lt;/span&gt; DirectoryInfo(Dts.Variables(&lt;span&gt;"ImportFolder"&lt;/span&gt;).Value.ToString())
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; dir.Exists &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:green;"&gt;' Create the filename for local storage using 
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:green;"&gt;' the GUID from SharePoint as this will be unique.
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; file &lt;span style="color:blue;"&gt;As&lt;/span&gt; FileInfo = &lt;span style="color:blue;"&gt;New&lt;/span&gt; FileInfo(dir.FullName &amp;amp; &lt;span&gt;"\"&lt;/span&gt; &amp;amp; Dts.Variables(&lt;span&gt;"WorkbookGUID"&lt;/span&gt;).Value.ToString() &amp;amp; Dts.Variables(&lt;span&gt;"Extension"&lt;/span&gt;).Value.ToString())
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;If&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Not&lt;/span&gt; file.Exists &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:green;"&gt;' get the path of the file we need to download
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; fileUrl &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;String&lt;/span&gt; = Dts.Variables(&lt;span&gt;"EncodedAbsUrl"&lt;/span&gt;).Value.ToString()
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;If&lt;/span&gt; fileUrl.Length &amp;lt;&amp;gt; 0 &lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:green;"&gt;' download the file from SharePoint or Archive file system to local folder
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; client &lt;span style="color:blue;"&gt;As&lt;/span&gt;
			&lt;span style="color:blue;"&gt;New&lt;/span&gt; WebClient()
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;If&lt;/span&gt; Left(fileUrl, 4).ToLower() = &lt;span&gt;"http"&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Then
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            &lt;span style="color:green;"&gt;'download the file from SharePoint
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            client.Credentials = System.Net.CredentialCache.DefaultCredentials
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            client.DownloadFile(fileUrl, file.FullName)
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;Else
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            &lt;span style="color:green;"&gt;' copy file from remote file system
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                            System.IO.File.Copy(fileUrl, file.FullName)
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;Else
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                        &lt;span style="color:blue;"&gt;Throw&lt;/span&gt;
			&lt;span style="color:blue;"&gt;New&lt;/span&gt; ApplicationException(&lt;span&gt;"EncodedAbsUrl variable does not contain a value!"&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;Else
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;                &lt;span style="color:blue;"&gt;Throw&lt;/span&gt;
			&lt;span style="color:blue;"&gt;New&lt;/span&gt; ApplicationException(&lt;span&gt;"ImportFolder does not exist!"&lt;/span&gt;)
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;If
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            Dts.Events.FireError(0, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, ex.Message, &lt;span style="color:blue;"&gt;String&lt;/span&gt;.Empty, 0)
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;            taskResult = Dts.Results.Failure
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Try
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;        Dts.TaskResult = taskResult
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Sub
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt;
			&lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=3402" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/MOSS/default.aspx">MOSS</category></item><item><title>SSIS: Calling SharePoint web services from the data flow</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/03/ssis-calling-sharepoint-web-services-from-the-data-flow.aspx</link><pubDate>Sat, 03 Nov 2007 11:21:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:3346</guid><dc:creator>DrJohn</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=3346</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/03/ssis-calling-sharepoint-web-services-from-the-data-flow.aspx#comments</comments><description>
&lt;p&gt;
In my &lt;a href="http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/02/Getting-a-list-of-files-from-a-moss-document-library-using-a-SharePoint-web-service.aspx" title="Getting a list of SharePoint files"&gt;previous post&lt;/a&gt;, I outlined how to call a SharePoint web service to obtain a list of all Excel files held in a document library.&amp;nbsp; However, that code was developed in Visual Studio where adding a reference to a web service is simplicity itself.&amp;nbsp; Doing the same in SSIS is more of a challenge as Visual Studio for Applications (VSA) does not have the &lt;span style="font-weight:bold;"&gt;Add Web Reference&lt;/span&gt; command familiar to Visual Studio developers.
&lt;/p&gt;

&lt;p&gt;
To keep my script component simple, I decided to place it in the data flow so that I could pass a list of SharePoint sites on the input buffer and the component could output a list of Excel files on the output buffer.&amp;nbsp; If you are familiar with the Script Component you will know that it can be used in three forms: as a &lt;span style="font-style:italic;"&gt;Source&lt;/span&gt;, a &lt;span style="font-style:italic;"&gt;Destination &lt;/span&gt;and as a &lt;span style="font-style:italic;"&gt;Transformation&lt;/span&gt;.&amp;nbsp; In its default form, the Transformation is synchronous (i.e. one line of output is written for every line of input).&amp;nbsp; As I wanted the script component to generate more rows on its output than it received, the first thing I needed to do was to switch it to asynchronous mode by changing the SynchronousInputID of the output buffer to zero.
&lt;/p&gt;

&lt;p&gt;
To call the SharePoint web service from within my SSIS script component I needed to create a Visual Basic proxy class using wsdl.exe using the following command-line:&lt;br&gt;&lt;br&gt;
&lt;code&gt;wsdl /language:VB http://yourhost/_vti_bin/lists.asmx?wsdl /out:SharePointList.vb&lt;/code&gt;
&lt;br&gt;&lt;br&gt;This proxy class was then imported into the Script Component by selecting "&lt;span style="font-style:italic;"&gt;Add Existing Item&lt;/span&gt;..." from the Project menu.&amp;nbsp;&amp;nbsp; I needed to delete the first few "garbage" characters and add references to the System.Xml and System.Web.Services .NET assemblies before the proxy class would compile. 
&lt;/p&gt;

&lt;p&gt;
Next I converted the C# code I developed in my console application (&lt;a href="http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/02/Getting-a-list-of-files-from-a-moss-document-library-using-a-SharePoint-web-service.aspx" title="Sharepoint web services"&gt;see previous post&lt;/a&gt;) to VB.NET using the excellent conversion routine from &lt;a href="http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/02/converting-c-to-vb-net-for-use-in-ssis.aspx" title="Converting C# to VB.NET"&gt;DeveloperFusion&lt;/a&gt; and pasted it into my script component.&amp;nbsp; After modifying the code to work with the input and output buffers the whole package worked fine.&amp;nbsp; Below is my final data flow.&lt;br&gt;&lt;br&gt;Beware!&amp;nbsp; If you need to call two different SharePoint web services from within the same script component, you will need to edit the code generated by wsdl.exe and add a Namespace in order to avoid conflicts.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.boviltd.talktalk.net/images/sharepoint_from_data_flow.jpg" title="Upsert Data Flow" alt="Upsert Data Flow" height="433" width="514"&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=3346" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/MOSS/default.aspx">MOSS</category></item><item><title>Converting C# to VB.NET for use in SSIS</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/02/converting-c-to-vb-net-for-use-in-ssis.aspx</link><pubDate>Fri, 02 Nov 2007 08:53:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:3273</guid><dc:creator>DrJohn</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=3273</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/02/converting-c-to-vb-net-for-use-in-ssis.aspx#comments</comments><description>&lt;P&gt;If you much prefer C# over VB.NET but are forced to use VB.NET as that is the only language supported by SSIS, you will love the tool I discovered.&amp;nbsp; Some cool guys over at DeveloperFusion have created an on-line &lt;A title="DeveloperFusion C# to VB.NET convertor" href="http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx"&gt;C# to VB.NET convertor&lt;/A&gt; which makes the transition simplicity itself.&amp;nbsp; It also works the other way around. So if you want to convert ugly VB.NET into cool C#, this is your answer.&amp;nbsp; Easy! &lt;/P&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=3273" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://sqlblogcasts.com/blogs/drjohn/archive/tags/VB.NET/default.aspx">VB.NET</category></item><item><title>Getting a list of files from a MOSS document library using a SharePoint web service</title><link>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/02/Getting-a-list-of-files-from-a-moss-document-library-using-a-SharePoint-web-service.aspx</link><pubDate>Fri, 02 Nov 2007 00:06:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:3250</guid><dc:creator>DrJohn</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/drjohn/rsscomments.aspx?PostID=3250</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/drjohn/archive/2007/11/02/Getting-a-list-of-files-from-a-moss-document-library-using-a-SharePoint-web-service.aspx#comments</comments><description>





&lt;div class="Section1"&gt;My challenge was simple.&amp;nbsp; I needed to develop an SSIS package that
would download and extract data from every Excel file held in document
libraries across several SharePoint sites.&amp;nbsp; SSIS was the natural choice as
the data needed to be cleaned and validated before being imported into a
database. However, SSIS is not great with web services – especially in the data
flow. As I not worked with the SharePoint web services much, I started with a
good old Console application.&lt;/div&gt;&lt;div class="Section1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="Section1"&gt;MOSS, or more accurately, WSS provides a whole host of &lt;a href="http://msdn2.microsoft.com/en-us/library/ms445760.aspx" title="WSS web services"&gt;web services&lt;/a&gt; to obtain information about
SharePoint sites.&amp;nbsp; However, figuring out which method to invoke and what
parameters to pass is more problematic.&amp;nbsp; Especially as many of the
parameters are chunks of Collaborative Application Mark-up Language (CAML) – a
dialect of XML developed by Microsoft specifically for use with SharePoint.&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="Section1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="Section1"&gt;&lt;b&gt;A False Start&lt;/b&gt; &lt;/div&gt;&lt;div class="Section1"&gt;My first console app simply obtained the GUID of the document library using the
&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;GetListCollection&lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;(&lt;/span&gt;) method of the Lists web service.&amp;nbsp; The GUID was then
passed to the GetListItems() method which duly provided all documents and folders
at the top level of the document library.&amp;nbsp; It then seemed logical to me to
recursively call the GetListItems() method using the GUID of each sub-folder.&amp;nbsp;
On no, how wrong could I be!&amp;nbsp; The GetListItems() method simply chokes on these
folder GUIDs.

&lt;/div&gt;&lt;div class="Section1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="Section1"&gt;On searching the internet I found many other incorrect forum posts and blog
entries about the same topic – but no working solutions.&amp;nbsp; I also made an
extensive search of my eBook collection – but again no solutions – which
overall motivated me to write this blog entry.

&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="Section1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="Section1"&gt;&lt;b&gt;The solution - RTFM&lt;/b&gt;&lt;/div&gt;&lt;div class="Section1"&gt;Well, if I had read the whole page in the manual, I would have got to the
solution &lt;span class="GramE"&gt;earlier&lt;/span&gt;&lt;img src="http://sqlblogcasts.com/emoticons/emotion-9.gif" alt="Crying" /&gt;.&amp;nbsp; The key to my puzzle was
the &lt;a href="http://msdn2.microsoft.com/en-us/library/lists.lists.getlistitems.aspx" title="QueryOptions documentation on MSDN"&gt;QueryOptions&lt;/a&gt; XML fragment which
has both a Folder element and the all important &amp;lt;&lt;span class="SpellE"&gt;ViewAttributes&lt;/span&gt;
Scope="Recursive" /&amp;gt; element. Using these elements together, it is
possible to obtain a list of all documents in all subfolders in the list.
Indeed, it does not even bother returning the subfolder details!

&lt;/div&gt;&lt;div class="Section1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="Section1"&gt;So here is the code for my working C# sample.&lt;/div&gt;&lt;div class="Section1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="Section1"&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;using&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; System;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;using&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; System.Collections.Generic;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;using&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; System.Text;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;using&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; System.Xml;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;using&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; System.Web.Services;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;using&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; System.Web;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;using&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; System.Net;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;namespace&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; ConsoleApplication1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; class&lt;/span&gt; Program&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; siteUrl = &lt;span&gt;@"http://yourserver/sites/yoursite"&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; documentLibraryName = &lt;span&gt;@"Shared
Documents"&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;SharePointList.Lists
wsList = &lt;span style="color:blue;"&gt;new&lt;/span&gt; SharePointList.Lists();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;wsList.Credentials
= System.Net.CredentialCache.DefaultCredentials;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;WebProxy
proxyObj = &lt;span style="color:blue;"&gt;new&lt;/span&gt; WebProxy(&lt;span&gt;"yourproxy"&lt;/span&gt;, 80); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;wsList.Proxy
= proxyObj;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;wsList.Url
= siteUrl + &lt;span&gt;@"/_vti_bin/lists.asmx"&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:green;"&gt;// get a list of all top level lists&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;XmlNode
allLists = wsList.GetListCollection();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:green;"&gt;// load into an XML document so we can use XPath to query
content&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;XmlDocument
allListsDoc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; XmlDocument();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;allListsDoc.LoadXml(allLists.OuterXml);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:green;"&gt;// allListsDoc.Save(@"c:\allListsDoc.xml");&lt;span&gt;  &lt;/span&gt;// for debug&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;XmlNamespaceManager
ns = &lt;span style="color:blue;"&gt;new&lt;/span&gt;
XmlNamespaceManager(allListsDoc.NameTable);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;ns.AddNamespace(&lt;span&gt;"d"&lt;/span&gt;, allLists.NamespaceURI);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:green;"&gt;// now get the GUID of the document library we are looking
for&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;XmlNode
dlNode = allListsDoc.SelectSingleNode(&lt;span&gt;"/d:Lists/d:List[@Title='"&lt;/span&gt;
+ documentLibraryName + &lt;span&gt;"']"&lt;/span&gt;, ns);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (dlNode == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Document
Library '{0}' not found!"&lt;/span&gt;, documentLibraryName);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// obtain the GUID for the document library and the webID&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; documentLibraryGUID = dlNode.Attributes[&lt;span&gt;"ID"&lt;/span&gt;].Value;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; webId = dlNode.Attributes[&lt;span&gt;"WebId"&lt;/span&gt;].Value;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Opening
folder '{0}' GUID={1}"&lt;/span&gt;, documentLibraryName, documentLibraryGUID);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// create ViewFields CAML&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlDocument
viewFieldsDoc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; XmlDocument();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlNode
ViewFields = AddXmlElement(viewFieldsDoc, &lt;span&gt;"ViewFields"&lt;/span&gt;,
&lt;span&gt;""&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddFieldRef(ViewFields,
&lt;span&gt;"GUID"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddFieldRef(ViewFields,
&lt;span&gt;"ContentType"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddFieldRef(ViewFields,
&lt;span&gt;"BaseName"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddFieldRef(ViewFields,
&lt;span&gt;"Modified"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddFieldRef(ViewFields,
&lt;span&gt;"EncodedAbsUrl"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;//viewFieldsDoc.Save(@"c:\viewFields.xml");&lt;span&gt;  &lt;/span&gt;// for debug&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:green;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// create QueryOptions CAML&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlDocument
queryOptionsDoc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; XmlDocument();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlNode
QueryOptions = AddXmlElement(queryOptionsDoc, &lt;span&gt;"QueryOptions"&lt;/span&gt;,
&lt;span&gt;""&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddXmlElement(QueryOptions,
&lt;span&gt;"Folder"&lt;/span&gt;, documentLibraryName);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddXmlElement(QueryOptions,
&lt;span&gt;"IncludeMandatoryColumns"&lt;/span&gt;, &lt;span&gt;"FALSE"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// this element is the key to getting the full recusive
list&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlNode
node = AddXmlElement(QueryOptions, &lt;span&gt;"ViewAttributes"&lt;/span&gt;,
&lt;span&gt;""&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;AddXmlAttribute(node,
&lt;span&gt;"Scope"&lt;/span&gt;, &lt;span&gt;"Recursive"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;queryOptionsDoc.Save(&lt;span&gt;@"c:\queryOptions.xml"&lt;/span&gt;);&lt;span&gt;  &lt;/span&gt;&lt;span style="color:green;"&gt;// for debug&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:green;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// obtain the list of items in the document library&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlNode
listContent = wsList.GetListItems(documentLibraryGUID, &lt;span style="color:blue;"&gt;null&lt;/span&gt;,
&lt;span style="color:blue;"&gt;null&lt;/span&gt;, ViewFields, &lt;span style="color:blue;"&gt;null&lt;/span&gt;,
QueryOptions, webId);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlDocument
xmlResultsDoc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; XmlDocument();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;xmlResultsDoc.LoadXml(listContent.OuterXml);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;ns
= &lt;span style="color:blue;"&gt;new&lt;/span&gt;
XmlNamespaceManager(xmlResultsDoc.NameTable);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;ns.AddNamespace(&lt;span&gt;"z"&lt;/span&gt;, &lt;span&gt;"#RowsetSchema"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// xmlResultsDoc.Save(@"c:\listContent.xml"); //
for debug&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:green;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;XmlNodeList
rows = xmlResultsDoc.SelectNodes(&lt;span&gt;"//z:row"&lt;/span&gt;,
ns);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (rows.Count == 0)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                              &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"No
content found"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (XmlNode row &lt;span style="color:blue;"&gt;in&lt;/span&gt;
rows)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                              &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;.WriteLine(row.Attributes[&lt;span&gt;"ows_ContentType"&lt;/span&gt;].Value + &lt;span&gt;" "&lt;/span&gt; + row.Attributes[&lt;span&gt;"ows_GUID"&lt;/span&gt;].Value + &lt;span&gt;" :: "&lt;/span&gt; + row.Attributes[&lt;span&gt;"ows_BaseName"&lt;/span&gt;].Value);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Done"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;.Read();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;



























































































































































&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; XmlNode
AddXmlElement(XmlNode parent, &lt;span style="color:blue;"&gt;string&lt;/span&gt;
elementName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; elementValue)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;XmlNode
element =
parent.AppendChild(parent.OwnerDocument.CreateNode(XmlNodeType.Element,
elementName, &lt;span&gt;""&lt;/span&gt;));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (elementValue != &lt;span&gt;""&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;element.InnerText
= elementValue;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; (element);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;













&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; XmlNode
AddXmlElement(XmlDocument parent, &lt;span style="color:blue;"&gt;string&lt;/span&gt;
elementName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; elementValue)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;XmlNode
element = parent.AppendChild(parent.CreateNode(XmlNodeType.Element,
elementName, &lt;span&gt;""&lt;/span&gt;));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (elementValue != &lt;span&gt;""&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                        &lt;/span&gt;element.InnerText
= elementValue;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; (element);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;













&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;bloc