<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.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>SSIS Team Blog : Samples</title><link>http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx</link><description>Tags: Samples</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>API Sample – Lookup Transform</title><link>http://blogs.msdn.com/mattm/archive/2009/01/02/api-sample-lookup-transform.aspx</link><pubDate>Fri, 02 Jan 2009 21:34:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9269538</guid><dc:creator>mmasson</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9269538.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9269538</wfw:commentRss><description>&lt;p&gt;This sample creates a data flow package with an OLEDB Source component feeding into a Lookup Transform. The Lookup transform is set to Full Cache mode, and uses [DimCustomer] as its reference table. &lt;/p&gt;  &lt;p&gt;Items of interest:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CustomerKey and GeographyKey are used as the index (join) columns. This is configured by using the JoinToReferenceColumn property&lt;/li&gt;    &lt;li&gt;The FirstName column is being overwritten by the value retrieved by the lookup transform&lt;/li&gt;    &lt;li&gt;The LastName2 column is being added as a new output column&lt;/li&gt; &lt;/ul&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;package = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Package&lt;/span&gt;();

    &lt;span style="color: green"&gt;// Add Data Flow Task
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Executable &lt;/span&gt;dataFlowTask = package.Executables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;STOCK:PipelineTask&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// Set the name (otherwise it will be a random GUID value)
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost = dataFlowTask &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost&lt;/span&gt;;
    taskHost.Name = &lt;span style="color: #a31515"&gt;&amp;quot;Data Flow Task&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;// We need a reference to the InnerObject to add items to the data flow
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe &lt;/span&gt;pipeline = taskHost.InnerObject &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe&lt;/span&gt;;

    &lt;span style="color: green"&gt;//
    // Add connection manager
    //

    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConnectionManager &lt;/span&gt;connection = package.Connections.Add(&lt;span style="color: #a31515"&gt;&amp;quot;OLEDB&amp;quot;&lt;/span&gt;);
    connection.Name = &lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;;
    connection.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;Data Source=localhost;Initial Catalog=AdventureWorksDW2008;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;//
    // Add OLEDB Source
    //

    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;srcComponent = pipeline.ComponentMetaDataCollection.New();
    srcComponent.ComponentClassID = &lt;span style="color: #a31515"&gt;&amp;quot;DTSAdapter.OleDbSource&amp;quot;&lt;/span&gt;;
    srcComponent.ValidateExternalMetadata = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
    &lt;span style="color: #2b91af"&gt;IDTSDesigntimeComponent100 &lt;/span&gt;srcDesignTimeComponent = srcComponent.Instantiate();
    srcDesignTimeComponent.ProvideComponentProperties();
    srcComponent.Name = &lt;span style="color: #a31515"&gt;&amp;quot;OleDb Source&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;// Configure it to read from the given table
    &lt;/span&gt;srcDesignTimeComponent.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;AccessMode&amp;quot;&lt;/span&gt;, 0);
    srcDesignTimeComponent.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;OpenRowset&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;[DimCustomer]&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// Set the connection manager
    &lt;/span&gt;srcComponent.RuntimeConnectionCollection[0].ConnectionManager = &lt;span style="color: #2b91af"&gt;DtsConvert&lt;/span&gt;.GetExtendedInterface(connection);
    srcComponent.RuntimeConnectionCollection[0].ConnectionManagerID = connection.ID;

    &lt;span style="color: green"&gt;// Retrieve the column metadata
    &lt;/span&gt;srcDesignTimeComponent.AcquireConnections(&lt;span style="color: blue"&gt;null&lt;/span&gt;);
    srcDesignTimeComponent.ReinitializeMetaData();
    srcDesignTimeComponent.ReleaseConnections();

    &lt;span style="color: green"&gt;// Add transform
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;lookupComponent = pipeline.ComponentMetaDataCollection.New();
    lookupComponent.ComponentClassID = &lt;span style="color: #a31515"&gt;&amp;quot;DTSTransform.Lookup&amp;quot;&lt;/span&gt;;
    lookupComponent.Name = &lt;span style="color: #a31515"&gt;&amp;quot;Lookup&amp;quot;&lt;/span&gt;;

    &lt;span style="color: #2b91af"&gt;CManagedComponentWrapper &lt;/span&gt;lookupWrapper = lookupComponent.Instantiate();
    lookupWrapper.ProvideComponentProperties();

    &lt;span style="color: green"&gt;// Connect the source and the transform
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSPath100 &lt;/span&gt;path = pipeline.PathCollection.New();
    path.AttachPathAndPropagateNotifications(srcComponent.OutputCollection[0], lookupComponent.InputCollection[0]);

    &lt;span style="color: green"&gt;//
    // Configure the transform
    //

    // Set the connection manager
    &lt;/span&gt;lookupComponent.RuntimeConnectionCollection[0].ConnectionManager = &lt;span style="color: #2b91af"&gt;DtsConvert&lt;/span&gt;.GetExtendedInterface(connection);
    lookupComponent.RuntimeConnectionCollection[0].ConnectionManagerID = connection.ID;

    &lt;span style="color: green"&gt;// Cache Type - Full = 0, Partial = 1, None = 2
    &lt;/span&gt;lookupWrapper.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;CacheType&amp;quot;&lt;/span&gt;, 0);
    lookupWrapper.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;SqlCommand&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;select * from [DimCustomer]&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// initialize metadata
    &lt;/span&gt;lookupWrapper.AcquireConnections(&lt;span style="color: blue"&gt;null&lt;/span&gt;);
    lookupWrapper.ReinitializeMetaData();
    lookupWrapper.ReleaseConnections();

    &lt;span style="color: green"&gt;// Mark the columns we are joining on
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSInput100 &lt;/span&gt;lookupInput = lookupComponent.InputCollection[0];
    &lt;span style="color: #2b91af"&gt;IDTSInputColumnCollection100 &lt;/span&gt;lookupInputColumns = lookupInput.InputColumnCollection;
    &lt;span style="color: #2b91af"&gt;IDTSVirtualInput100 &lt;/span&gt;lookupVirtualInput = lookupInput.GetVirtualInput();
    &lt;span style="color: #2b91af"&gt;IDTSVirtualInputColumnCollection100 &lt;/span&gt;lookupVirtualInputColumns = lookupVirtualInput.VirtualInputColumnCollection;

    &lt;span style="color: green"&gt;// We are joining on CustomerKey and GeographyKey
    // Note: join columns should be marked as READONLY
    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;joinColumns = &lt;span style="color: blue"&gt;new string&lt;/span&gt;[] { &lt;span style="color: #a31515"&gt;&amp;quot;CustomerKey&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;GeographyKey&amp;quot; &lt;/span&gt;};
    &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;columnName &lt;span style="color: blue"&gt;in &lt;/span&gt;joinColumns)
    {
        &lt;span style="color: #2b91af"&gt;IDTSVirtualInputColumn100 &lt;/span&gt;virtualColumn = lookupVirtualInputColumns[columnName];
        &lt;span style="color: #2b91af"&gt;IDTSInputColumn100 &lt;/span&gt;inputColumn = lookupWrapper.SetUsageType(lookupInput.ID, lookupVirtualInput, virtualColumn.LineageID, &lt;span style="color: #2b91af"&gt;DTSUsageType&lt;/span&gt;.UT_READONLY);
        lookupWrapper.SetInputColumnProperty(lookupInput.ID, inputColumn.ID, &lt;span style="color: #a31515"&gt;&amp;quot;JoinToReferenceColumn&amp;quot;&lt;/span&gt;, columnName);
    }
    
    &lt;span style="color: green"&gt;// Overwrite the existing FirstName column value with the one returned by the Lookup.
    // To do this, we need to flag the column as READWRITE, and set the CopyFromReferenceColumn property on the input
    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;overwriteColumns = &lt;span style="color: blue"&gt;new string&lt;/span&gt;[] { &lt;span style="color: #a31515"&gt;&amp;quot;FirstName&amp;quot; &lt;/span&gt;};
    &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;columnName &lt;span style="color: blue"&gt;in &lt;/span&gt;overwriteColumns)
    {
        &lt;span style="color: #2b91af"&gt;IDTSVirtualInputColumn100 &lt;/span&gt;virtualColumn = lookupVirtualInputColumns[columnName];
        &lt;span style="color: #2b91af"&gt;IDTSInputColumn100 &lt;/span&gt;inputColumn = lookupWrapper.SetUsageType(lookupInput.ID, lookupVirtualInput, virtualColumn.LineageID, &lt;span style="color: #2b91af"&gt;DTSUsageType&lt;/span&gt;.UT_READWRITE);

        lookupWrapper.SetInputColumnProperty(lookupInput.ID, inputColumn.ID, &lt;span style="color: #a31515"&gt;&amp;quot;CopyFromReferenceColumn&amp;quot;&lt;/span&gt;, columnName);
    }

    &lt;span style="color: green"&gt;// First output is the Match output
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSOutput100 &lt;/span&gt;lookupMatchOutput = lookupComponent.OutputCollection[0];

    &lt;span style="color: green"&gt;// Add a new LastName2 column from the &amp;quot;LastName&amp;quot; column returned by the lookup
    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;newColumns = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();
    newColumns.Add(&lt;span style="color: #a31515"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;LastName2&amp;quot;&lt;/span&gt;);

    &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;sourceColumn &lt;span style="color: blue"&gt;in &lt;/span&gt;newColumns.Keys)
    {
        &lt;span style="color: blue"&gt;string &lt;/span&gt;newColumnName = newColumns[sourceColumn];
        &lt;span style="color: blue"&gt;string &lt;/span&gt;description = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Copy of {0}&amp;quot;&lt;/span&gt;, sourceColumn);

        &lt;span style="color: green"&gt;// insert the new column
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSOutputColumn100 &lt;/span&gt;outputColumn = lookupWrapper.InsertOutputColumnAt(lookupMatchOutput.ID, 0, newColumnName, description);
        lookupWrapper.SetOutputColumnProperty(lookupMatchOutput.ID, outputColumn.ID, &lt;span style="color: #a31515"&gt;&amp;quot;CopyFromReferenceColumn&amp;quot;&lt;/span&gt;, sourceColumn);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9269538" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/Lookup/default.aspx">Lookup</category><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>API Sample – Row Count Transform</title><link>http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-row-count-transform.aspx</link><pubDate>Wed, 31 Dec 2008 01:47:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9257716</guid><dc:creator>mmasson</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9257716.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9257716</wfw:commentRss><description>&lt;p&gt;This sample creates a data flow package with an OLEDB Source that feeds into a Row Count transform. The Row Count transform is configured to store the result in the RowCountVar package variable.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;package = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Package&lt;/span&gt;();

    &lt;span style="color: green"&gt;// Add Data Flow Task
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Executable &lt;/span&gt;dataFlowTask = package.Executables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;STOCK:PipelineTask&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// Set the name (otherwise it will be a random GUID value)
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost = dataFlowTask &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost&lt;/span&gt;;
    taskHost.Name = &lt;span style="color: #a31515"&gt;&amp;quot;Data Flow Task&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;// We need a reference to the InnerObject to add items to the data flow
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe &lt;/span&gt;pipeline = taskHost.InnerObject &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe&lt;/span&gt;;

    &lt;span style="color: green"&gt;//
    // Create a package variable to store the row count value
    //

    &lt;/span&gt;package.Variables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;RowCountVar&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;User&amp;quot;&lt;/span&gt;, 0);

    &lt;span style="color: green"&gt;//
    // Add connection manager
    //

    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConnectionManager &lt;/span&gt;connection = package.Connections.Add(&lt;span style="color: #a31515"&gt;&amp;quot;OLEDB&amp;quot;&lt;/span&gt;);
    connection.Name = &lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;;
    connection.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;Data Source=localhost;Initial Catalog=AdventureWorksDW2008;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;//
    // Add OLEDB Source
    //

    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;srcComponent = pipeline.ComponentMetaDataCollection.New();
    srcComponent.ComponentClassID = &lt;span style="color: #a31515"&gt;&amp;quot;DTSAdapter.OleDbSource&amp;quot;&lt;/span&gt;;
    srcComponent.ValidateExternalMetadata = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
    &lt;span style="color: #2b91af"&gt;IDTSDesigntimeComponent100 &lt;/span&gt;srcDesignTimeComponent = srcComponent.Instantiate();
    srcDesignTimeComponent.ProvideComponentProperties();
    srcComponent.Name = &lt;span style="color: #a31515"&gt;&amp;quot;OleDb Source&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;// Configure it to read from the given table
    &lt;/span&gt;srcDesignTimeComponent.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;AccessMode&amp;quot;&lt;/span&gt;, 0);
    srcDesignTimeComponent.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;OpenRowset&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;[DimCustomer]&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// Set the connection manager
    &lt;/span&gt;srcComponent.RuntimeConnectionCollection[0].ConnectionManager = &lt;span style="color: #2b91af"&gt;DtsConvert&lt;/span&gt;.GetExtendedInterface(connection);
    srcComponent.RuntimeConnectionCollection[0].ConnectionManagerID = connection.ID;

    &lt;span style="color: green"&gt;// Retrieve the column metadata
    &lt;/span&gt;srcDesignTimeComponent.AcquireConnections(&lt;span style="color: blue"&gt;null&lt;/span&gt;);
    srcDesignTimeComponent.ReinitializeMetaData();
    srcDesignTimeComponent.ReleaseConnections();

    &lt;span style="color: green"&gt;//
    // Add Row Count transform
    //

    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;rowCount = pipeline.ComponentMetaDataCollection.New();
    rowCount.ComponentClassID = &lt;span style="color: #a31515"&gt;&amp;quot;DTSTransform.RowCount&amp;quot;&lt;/span&gt;;
    &lt;span style="color: #2b91af"&gt;CManagedComponentWrapper &lt;/span&gt;instance = rowCount.Instantiate();
    instance.ProvideComponentProperties();

    &lt;span style="color: green"&gt;// Set the variable name property
    &lt;/span&gt;instance.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;VariableName&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;User::RowCountVar&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;//
    // Connect the OLEDB Source and the Row Count
    //

    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSPath100 &lt;/span&gt;path = pipeline.PathCollection.New();
    path.AttachPathAndPropagateNotifications(srcComponent.OutputCollection[0], rowCount.InputCollection[0]);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9257716" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>API Sample – ADO.Net Source</title><link>http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-ado-net-source.aspx</link><pubDate>Wed, 31 Dec 2008 01:38:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9257705</guid><dc:creator>mmasson</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9257705.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9257705</wfw:commentRss><description>&lt;p&gt;This sample creates a data flow package with an ADO.Net source.&lt;/p&gt;  &lt;p&gt;Items of interest:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The AccessMode property is similar to that of the &lt;a href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-oledb-source-and-oledb-destination.aspx"&gt;OleDB Source&lt;/a&gt;, except it only has two values – 0 for TableOrViewName, and 2 for SqlCommand. Examples of both are included in the sample (one is commented out).&lt;/li&gt;    &lt;li&gt;To be able to reference the DataReaderSourceAdapter (the class name of the ADO.Net Source), you’ll need to add a reference to the ADONETSrc assembly - C:\Program Files\Microsoft SQL Server\100\DTS\PipelineComponents\Microsoft.SqlServer.ADONETSrc.dll&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;package = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Package&lt;/span&gt;();

    &lt;span style="color: green"&gt;// Add Data Flow Task
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Executable &lt;/span&gt;dataFlowTask = package.Executables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;STOCK:PipelineTask&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// Set the name (otherwise it will be a random GUID value)
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost = dataFlowTask &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost&lt;/span&gt;;
    taskHost.Name = &lt;span style="color: #a31515"&gt;&amp;quot;Data Flow Task&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;// We need a reference to the InnerObject to add items to the data flow
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe &lt;/span&gt;pipeline = taskHost.InnerObject &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe&lt;/span&gt;;

    &lt;span style="color: green"&gt;// Create ADO.Net connection manager
    &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;connectionType = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;ADO.NET:{0}&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;SqlConnection&lt;/span&gt;).AssemblyQualifiedName);
    &lt;span style="color: #2b91af"&gt;ConnectionManager &lt;/span&gt;connection = package.Connections.Add(connectionType);
    connection.Name = &lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;;
    connection.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;Data Source=localhost;Initial Catalog=AdventureWorksDW2008;Integrated Security=True;&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;// Add the ADO.NET Source
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;src = pipeline.ComponentMetaDataCollection.New();
    src.Name = &lt;span style="color: #a31515"&gt;&amp;quot;AdoNet Source&amp;quot;&lt;/span&gt;;
    src.ComponentClassID = &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;DataReaderSourceAdapter&lt;/span&gt;).AssemblyQualifiedName;
    src.ValidateExternalMetadata = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
    &lt;span style="color: #2b91af"&gt;IDTSDesigntimeComponent100 &lt;/span&gt;instance = src.Instantiate();
    instance.ProvideComponentProperties();

    &lt;span style="color: green"&gt;// Configure the source
    //instance.SetComponentProperty(&amp;quot;AccessMode&amp;quot;, 2);
    //instance.SetComponentProperty(&amp;quot;SqlCommand&amp;quot;, &amp;quot;select * from [DimCustomer]&amp;quot;);
    &lt;/span&gt;instance.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;AccessMode&amp;quot;&lt;/span&gt;, 0);
    instance.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;TableOrViewName&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;\&amp;quot;dbo\&amp;quot;.\&amp;quot;DimCustomer\&amp;quot;&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// Set the connection manager
    &lt;/span&gt;src.RuntimeConnectionCollection[0].ConnectionManager = &lt;span style="color: #2b91af"&gt;DtsConvert&lt;/span&gt;.GetExtendedInterface(connection);
    src.RuntimeConnectionCollection[0].ConnectionManagerID = connection.ID;

    &lt;span style="color: green"&gt;// Retrieve the column metadata
    &lt;/span&gt;instance.AcquireConnections(&lt;span style="color: blue"&gt;null&lt;/span&gt;);
    instance.ReinitializeMetaData();
    instance.ReleaseConnections();
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9257705" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>EzAPI – Alternative package creation API</title><link>http://blogs.msdn.com/mattm/archive/2008/12/30/ezapi-alternative-package-creation-api.aspx</link><pubDate>Wed, 31 Dec 2008 00:20:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9257631</guid><dc:creator>mmasson</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9257631.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9257631</wfw:commentRss><description>&lt;p&gt;SSIS provides APIs to &lt;a href="http://msdn.microsoft.com/en-us/library/ms345167.aspx"&gt;programmatically create&lt;/a&gt; dtsx packages. While we provide a managed wrapper layer for the runtime/control flow, you have to use the lower level COM wrappers (DTSPipelineWrap) to create your data flows – the usability of which could definitely be improved. &lt;/p&gt;  &lt;p&gt;Evgeny Koblov, one of the testers on the SSIS team, has put together a really &lt;a href="http://www.codeplex.com/SQLSrvIntegrationSrv/Release/ProjectReleases.aspx?ReleaseId=21238"&gt;powerful framework for generating packages called EzAPI&lt;/a&gt;. It’s been used by the test team internally for awhile now, and we’ve now published it to &lt;a href="http://www.codeplex.com/"&gt;Codeplex&lt;/a&gt; as well. The project includes a pretty detailed readme file, as well as some great samples on how to use the classes. &lt;/p&gt;  &lt;p&gt;This post is mostly a formatted version of the readme file written by Evgeny. It is available in the root directory of the project’s source code.&lt;/p&gt;  &lt;h2&gt;Overview&lt;/h2&gt;  &lt;p&gt;This sample provides some functionality to easily create SSIS packages programmatically and dynamically alter their objects (tasks, components, changing metadata, connection strings, etc). This framework supports:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Creation SSIS packages of any complexity including both SSIS runtime and pipeline (tasks, containers and components) &lt;/li&gt;    &lt;li&gt;BIDS like behavior (automatic column mapping in destinations, automatic metadata refresh, default values of properties, etc) &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Requirements&lt;/h2&gt;  &lt;p&gt;To use EzAPI framework and be able to compile and run the demo applications, the following components are required:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The sample must be installed on the local hard drive &lt;/li&gt;    &lt;li&gt;You must install the common tools for SQL Server 2008 &lt;/li&gt;    &lt;li&gt;You must install SQL Server Integration Services 2008 &lt;/li&gt;    &lt;li&gt;Adventure Works sample database installed under a default instance on the local machine &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Installer&lt;/h2&gt;  &lt;p&gt;The installer will place source and project files into the chosen directory. Additionally, pre-built binaries are placed into the Global Assembly Cache (GAC) and into the C:\Program Files\Microsoft SQL Server\100\DTS\Binn folder&lt;/p&gt;  &lt;h2&gt;Background&lt;/h2&gt;  &lt;p&gt;Having an easy way to create SSIS packages programmatically is vital. In some cases static packages do not provide enough flexibility – it is hard to change property task or component of a static package using SSIS object model while using configurations is not always possible. Current approach to create SSIS package programmatically is to use SSIS object model directly. However SSIS object SSIS object model was designed to be universal for all kinds of components (native and managed ones) and to separate runtime and design time phases of component usage. However both of the stages use the same metadata. This is the reason why SSIS distinguishes design-time, runtime functionality and metadata. The side effect is that more code is necessary to create a package and once the package is created – it is not very convenient to change properties of pipeline components and especially metadata of input, output, virtual and external columns. &lt;/p&gt;  &lt;p&gt;However, in .NET managed world we can use all the advantages of OOP and have a corresponding class that will encapsulate both metadata and operations that can be made on them – so, there is no need to separate it as we do not deal with runtime internals during design phase.&lt;/p&gt;  &lt;p&gt;The framework proposed in this sample can significantly reduce the amount of code that need to be supported and allows more efficient development of SSIS packages programmatically.&lt;/p&gt;  &lt;h2&gt;EzAPI Architecture&lt;/h2&gt;  &lt;p&gt;EzAPI takes SSIS COM object (implemented via many C++ and C# classes) as a single entity. It means it maps each EzAPI object to each SSIS COM object. Here is how it approximately looks like for control flow and for data flow:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Class hierarchy for SSIS runtime " border="0" alt="Class hierarchy for SSIS runtime " src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/ezapi1_1.png" width="337" height="255" /&gt; &lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;Fig 1a – class hierarchy for SSIS runtime&lt;/strong&gt; &lt;/h6&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ezapi2" border="0" alt="ezapi2" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/ezapi2_1.png" width="359" height="254" /&gt; &lt;/p&gt;  &lt;h6&gt;Fig 1b – class hierarchy for SSIS pipeline&lt;/h6&gt;  &lt;p&gt;In the control flow – the base entity is executable, that can be either a container or a task. So EzContainer and EzTask classes derive from EzExecutable class. Then all the containers derive from EzContainer and all tasks derive from EzTask. &lt;/p&gt;  &lt;p&gt;In the pipeline – component is the base entity. We have three types of components (can be easily noticed in BIDS): Sources, Destinations and Transformations. Sources and Destinations are actually adapters that connect SSIS with some input or output (Database, Flat File, Variable, etc) That’s why they share some functionality and derive from EzAdapter class. &lt;/p&gt;  &lt;p&gt;This approach allows accumulating common functionality in the base classes on each level of hierarchy. When you use SSIS object model or PackageBuilder you should constantly duplicate code that retrieves instances of SSIS objects, their metadata, implements column mapping logic (EzAPI allows both – default , BIDS-like mapping, and custom mapping via special functions MapColumn and UnmapColumn), etc.&lt;/p&gt;  &lt;h2&gt;Using EzAPI&lt;/h2&gt;  &lt;p&gt;This section contains some examples of how EzAPI can be used&lt;/p&gt;  &lt;p&gt;&lt;b&gt;To design a package using EzAPI:&lt;/b&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create a new .NET project. &lt;/li&gt;    &lt;li&gt;Add reference to EzAPI.dll. &lt;/li&gt;    &lt;li&gt;Add using entry: using Microsoft.SqlServer.SSIS.EzAPI; &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Creation of package with single task&lt;/h3&gt;  &lt;p&gt;The example below creates packages with ExecutePackageTask:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.SqlServer.SSIS.EzAPI;
…

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;ConsoleApplication1
{
    &lt;span style="color: green"&gt;// DEMO1: This package contains a single Execute package task
    &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecPkgPackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzPackage
    &lt;/span&gt;{
        &lt;span style="color: green"&gt;// Provide this constructor only if you want to overload Assignment operator
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;EzExecPkgPackage(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(p) { }   &lt;span style="color: green"&gt;// this constructor MUST BE present

        // Provide assignment operator if you want to be able to Assign SSIS Package to EzPackage
        &lt;/span&gt;&lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecPkgPackage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecPkgPackage&lt;/span&gt;(p); }

        &lt;span style="color: green"&gt;// All the tasks, components and connection managers which should be linked to the corresponding
        // SSIS package objects MUST BE PUBLIC MEMBERS if you want to be able to assign SSIS package to EzPackage
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecPackage &lt;/span&gt;ExecPkg;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFileCM &lt;/span&gt;PkgCM;

        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzExecPkgPackage(&lt;span style="color: blue"&gt;string &lt;/span&gt;pkgName)
            : &lt;span style="color: blue"&gt;base&lt;/span&gt;()
        {
            PkgCM = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFileCM&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            PkgCM.ConnectionString = pkgName;
            PkgCM.Name = &lt;span style="color: #a31515"&gt;&amp;quot;PackageConnection&amp;quot;&lt;/span&gt;;
            ExecPkg = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecPackage&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            ExecPkg.Name = &lt;span style="color: #a31515"&gt;&amp;quot;ExecutePackage&amp;quot;&lt;/span&gt;;
            ExecPkg.Connection = PkgCM;
        }

        [&lt;span style="color: #2b91af"&gt;STAThread&lt;/span&gt;]
        &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span style="color: green"&gt;// DEMO 1
            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzPackage &lt;/span&gt;p = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzPackage&lt;/span&gt;();
            p.SaveToFile(&lt;span style="color: #a31515"&gt;&amp;quot;testpkg.dtsx&amp;quot;&lt;/span&gt;);
            &lt;span style="color: #2b91af"&gt;EzExecPkgPackage &lt;/span&gt;p1 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecPkgPackage&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;testpkg.dtsx&amp;quot;&lt;/span&gt;);
            p1.SaveToFile(&lt;span style="color: #a31515"&gt;&amp;quot;demo1.dtsx&amp;quot;&lt;/span&gt;);
            p1.Execute();
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package1 executed with result {0}\n&amp;quot;&lt;/span&gt;, p1.ExecutionResult));
        }
    }
}&lt;/pre&gt;

&lt;p&gt;This code will create package with a single ExecutePackageTask:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_3.png" width="314" height="170" /&gt;&lt;/p&gt;

&lt;h3&gt;Creation of package with simple dataflow&lt;/h3&gt;

&lt;p&gt;The next example shows how to create a package with a simple dataflow that has OleDB source and FlatFile destination.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;ConsoleApplication1
{
    &lt;span style="color: green"&gt;// DEMO2: Simple data transfer from source to destination. Use EzSrcDestPackage template for this
    &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbToFilePackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzSrcDestPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;&amp;gt;
    {
        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzOleDbToFilePackage(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(p) { }
        &lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbToFilePackage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbToFilePackage&lt;/span&gt;(p); }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzOleDbToFilePackage(&lt;span style="color: blue"&gt;string &lt;/span&gt;srv, &lt;span style="color: blue"&gt;string &lt;/span&gt;db, &lt;span style="color: blue"&gt;string &lt;/span&gt;table, &lt;span style="color: blue"&gt;string &lt;/span&gt;file)
            : &lt;span style="color: blue"&gt;base&lt;/span&gt;()
        {
            SrcConn.SetConnectionString(srv, db);
            Source.Table = table;
            DestConn.ConnectionString = file;
            Dest.Overwrite = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
            &lt;span style="color: green"&gt;// This method defines the columns in FlatFile connection manager which have the same
            // datatypes as flat file destination
            &lt;/span&gt;Dest.DefineColumnsInCM();
        }

        [&lt;span style="color: #2b91af"&gt;STAThread&lt;/span&gt;]
        &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span style="color: green"&gt;// DEMO 2
            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbToFilePackage &lt;/span&gt;p2 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbToFilePackage&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;result.txt&amp;quot;&lt;/span&gt;);
            p2.DataFlow.Disable = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
            p2.Execute();
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package2 executed with result {0}\n&amp;quot;&lt;/span&gt;, p2.ExecutionResult));
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Dataflow task of the created package looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_6.png" width="334" height="239" /&gt; &lt;/p&gt;

&lt;p&gt;Notice that the components are already attached, fields in connection managers are defined. Also Input and external columns with the same names are automatically mapped in destination:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_9.png" width="606" height="517" /&gt; &lt;/p&gt;

&lt;p&gt;Another thing that is worth mentioning is that in this example a template class was used:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;EzSrcDestPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Here is where EzAPI becomes really powerful. Even this simple template class allows creation of packages with dataflow task with any source and any destination, by just specifying template parameters. As for all the properties of package, dataflow task, or components – they can be set directly in the testcase, instead of passing them to “builder” using helper classes. &lt;/p&gt;

&lt;h3&gt;Package with DataFlow transformation&lt;/h3&gt;

&lt;p&gt;Now let’s create a package that has structure used by most test suites that create packages programmatically, i.e. package with dataflow: source-&amp;gt;transform-&amp;gt;destination:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;&amp;lt;EzTransform&amp;gt; : &lt;span style="color: #2b91af"&gt;EzTransformPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;, EzTransform, &lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;&amp;gt; &lt;span style="color: blue"&gt;where &lt;/span&gt;EzTransform: &lt;span style="color: #2b91af"&gt;EzComponent
&lt;/span&gt;{
    &lt;span style="color: green"&gt;// These two methods are not deployed as I am not going to assign SSIS package to EzSortPackage in demo
    &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;EzMyPackage(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(p) { }
    &lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;&amp;lt;EzTransform&amp;gt;(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;&amp;lt;EzTransform&amp;gt;(p); }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzMyPackage(&lt;span style="color: blue"&gt;string &lt;/span&gt;srv, &lt;span style="color: blue"&gt;string &lt;/span&gt;db, &lt;span style="color: blue"&gt;string &lt;/span&gt;sql, &lt;span style="color: blue"&gt;string &lt;/span&gt;file) : &lt;span style="color: blue"&gt;base&lt;/span&gt;()
    {
        SrcConn.SetConnectionString(srv, db);
        Source.SqlCommand = sql;
        DestConn.ConnectionString = file;
        Dest.Overwrite = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
        Dest.DefineColumnsInCM();
    }

}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;And now – this is how package with Sort Transform can be created and used:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color: green"&gt;// DEMO 3
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzSortTransform&lt;/span&gt;&amp;gt; p3 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzSortTransform&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;select * from Person.Address&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;result1.txt&amp;quot;&lt;/span&gt;);
    p3.Transform.EliminateDuplicates = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
    p3.Transform.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;] = -1; &lt;span style="color: green"&gt;// sort in descending order
    &lt;/span&gt;p3.SaveToFile(&lt;span style="color: #a31515"&gt;&amp;quot;demo3.dtsx&amp;quot;&lt;/span&gt;);
    p3.Execute();
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package3 executed with result {0}\n&amp;quot;&lt;/span&gt;, p3.ExecutionResult));
    &lt;span style="color: green"&gt;// Assign SSIS package to EzPackage
    &lt;/span&gt;p3 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Application&lt;/span&gt;().LoadPackage(&lt;span style="color: #a31515"&gt;&amp;quot;demo3.dtsx&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;null&lt;/span&gt;);
    p3.Execute();
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package3 executed with result {0}\n&amp;quot;&lt;/span&gt;, p3.ExecutionResult));
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;And this is how to turn it into package with DerivedColumn transform:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzDerivedColumn&lt;/span&gt;&amp;gt; p = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzDerivedColumn&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;c:\\result1.txt&amp;quot;&lt;/span&gt;);
    p.Transform.Expression[&lt;span style="color: #a31515"&gt;&amp;quot;SmallDate1&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;DATEADD(\&amp;quot;Year\&amp;quot;,1,SmallDate1)&amp;quot;&lt;/span&gt;; &lt;span style="color: green"&gt;// Setting derived column expressions
    &lt;/span&gt;p.Transform.Expression[&lt;span style="color: #a31515"&gt;&amp;quot;Date1&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;DATEADD(\&amp;quot;Year\&amp;quot;,1,Date1)&amp;quot;&lt;/span&gt;;
    p.Transform.Expression[&lt;span style="color: #a31515"&gt;&amp;quot;SmallDate2&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;DATEADD(\&amp;quot;Quarter\&amp;quot;,2,SmallDate2)&amp;quot;&lt;/span&gt;;
    p.Transform.Expression[&lt;span style="color: #a31515"&gt;&amp;quot;Date2&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;DATEADD(\&amp;quot;Quarter\&amp;quot;,2,Date2)&amp;quot;&lt;/span&gt;;
    p.Transform.Expression[&lt;span style="color: #a31515"&gt;&amp;quot;SmallDate3&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;DATEADD(\&amp;quot;Month\&amp;quot;,4,SmallDate3)&amp;quot;&lt;/span&gt;;
    p.Transform.Expression[&lt;span style="color: #a31515"&gt;&amp;quot;Date3&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;DATEADD(\&amp;quot;Month\&amp;quot;,4,Date3)&amp;quot;&lt;/span&gt;;
    p.SaveToFile(&lt;span style="color: #a31515"&gt;@&amp;quot;C:\temp\ezdemo\demo3.dtsx&amp;quot;&lt;/span&gt;);
    p.Execute();
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package3 executed with result {0}\n&amp;quot;&lt;/span&gt;, p.ExecutionResult));
    p = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Application&lt;/span&gt;().LoadPackage(&lt;span style="color: #a31515"&gt;@&amp;quot;C:\temp\ezdemo\demo3.dtsx&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;null&lt;/span&gt;); &lt;span style="color: green"&gt;//assign SSIS package to EzPackage
    &lt;/span&gt;p.Execute();
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package3 executed with result {0}\n&amp;quot;&lt;/span&gt;, p.ExecutionResult));
}&lt;/pre&gt;

&lt;p&gt;We didn’t have to create a separate class for that – we could use existing template without introducing any modifications.&lt;/p&gt;

&lt;h3&gt;&lt;a name="_Toc213055180"&gt;Package with &lt;/a&gt;Loop containers&lt;/h3&gt;

&lt;p&gt;Another possible scenario is execution of some process in a loop. EzAPI provides this possibility and here is the example:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLoopSortPackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzLoopTransformPackage&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSortTransform&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;&amp;gt;
{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzLoopSortPackage(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(p) { }
    &lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLoopSortPackage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLoopSortPackage&lt;/span&gt;(p); }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzLoopSortPackage(&lt;span style="color: blue"&gt;string &lt;/span&gt;srv, &lt;span style="color: blue"&gt;string &lt;/span&gt;db, &lt;span style="color: blue"&gt;string &lt;/span&gt;table, &lt;span style="color: blue"&gt;string &lt;/span&gt;file)
        : &lt;span style="color: blue"&gt;base&lt;/span&gt;()
    {
        SrcConn.SetConnectionString(srv, db);
        Source.Table = table;
        Source.AccessMode = &lt;span style="color: #2b91af"&gt;AccessMode&lt;/span&gt;.AM_OPENROWSET;
        DestConn.ConnectionString = file;
        Dest.Overwrite = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
        Dest.DefineColumnsInCM();
    }

    [&lt;span style="color: #2b91af"&gt;STAThread&lt;/span&gt;]
    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
    {
        &lt;span style="color: #2b91af"&gt;EzLoopSortPackage &lt;/span&gt;p5 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLoopSortPackage&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;result1.txt&amp;quot;&lt;/span&gt;);
        p5.Transform.MaxThreads = -1; &lt;span style="color: green"&gt;// Do not limit number of threads
        &lt;/span&gt;p5.Transform.EliminateDuplicates = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
        p5.Transform.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;] = -1; &lt;span style="color: green"&gt;// sort in descending order
        &lt;/span&gt;p5.Variables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;LoopCounter&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;User&amp;quot;&lt;/span&gt;, 0);
        p5.ForLoop.InitExpression = &lt;span style="color: #a31515"&gt;&amp;quot;@[User::LoopCounter] = 0&amp;quot;&lt;/span&gt;;
        p5.ForLoop.AssignExpression = &lt;span style="color: #a31515"&gt;&amp;quot;@[User::LoopCounter] = @[User::LoopCounter] + 1&amp;quot;&lt;/span&gt;;
        p5.ForLoop.EvalExpression = &lt;span style="color: #a31515"&gt;&amp;quot;@[User::LoopCounter] &amp;lt; 3&amp;quot;&lt;/span&gt;;
        p5.Execute();
        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package5 executed with result {0}\n&amp;quot;&lt;/span&gt;, p5.ExecutionResult));
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;This example creates a package with dataflow task executed in a for loop 3 times. The code above is pretty straightforward, all the property names are the same as they are in BIDS. Here is the package created:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_12.png" width="314" height="210" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_15.png" width="334" height="312" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_18.png" width="444" height="282" /&gt; &lt;/p&gt;

&lt;h3&gt;Package with Multiple dataflows&lt;/h3&gt;

&lt;p&gt;Another important scenario is package with multiple dataflows. A typical example here is lookup transform with full or partial cache.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;ConsoleApplication1
{
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookupCachePkg &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzPkgWithExec&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzTransformDF&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzCacheTransform&lt;/span&gt;&amp;gt;&amp;gt;
    {
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzTransDestConnDF&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzLookup&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;&amp;gt; LookupDF;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzLookupCachePkg(&lt;span style="color: blue"&gt;string &lt;/span&gt;srv, &lt;span style="color: blue"&gt;string &lt;/span&gt;srcDb, &lt;span style="color: blue"&gt;string &lt;/span&gt;refDb, &lt;span style="color: blue"&gt;string &lt;/span&gt;refSql) : &lt;span style="color: blue"&gt;base&lt;/span&gt;()
        {
            LookupDF = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzTransDestConnDF&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzLookup&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            LookupDF.AttachTo(Exec);
            Exec.Transform.Connection = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzCacheCM&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            LookupDF.Transform.CacheConnection = Exec.Transform.Connection;
            Exec.Transform.Connection.Name = &lt;span style="color: #a31515"&gt;&amp;quot;Cache&amp;quot;&lt;/span&gt;;
            Variables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;CheckSum0&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;new byte&lt;/span&gt;[] { });
            Exec.Name = &lt;span style="color: #a31515"&gt;&amp;quot;CacheDF&amp;quot;&lt;/span&gt;;
            Exec.SrcConn.Name = &lt;span style="color: #a31515"&gt;&amp;quot;RefDb&amp;quot;&lt;/span&gt;;
            Exec.SrcConn.SetConnectionString(srv, refDb);
            Exec.Source.SqlCommand = refSql;
            Exec.Transform.ProvideInputToCache();
            LookupDF.SrcConn.Name = &lt;span style="color: #a31515"&gt;&amp;quot;SrcDb&amp;quot;&lt;/span&gt;;
            LookupDF.SrcConn.SetConnectionString(srv, srcDb);
            LookupDF.Transform.Meta.OutputCollection[0].ErrorRowDisposition = Microsoft.SqlServer.Dts.Pipeline.Wrapper.&lt;span style="color: #2b91af"&gt;DTSRowDisposition&lt;/span&gt;.RD_IgnoreFailure;
            LookupDF.Name = &lt;span style="color: #a31515"&gt;&amp;quot;LookupDF&amp;quot;&lt;/span&gt;;
            LookupDF.DestConn.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;demo2.txt&amp;quot;&lt;/span&gt;;
        }
        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzLookupCachePkg(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(p) { }   
        &lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookupCachePkg&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookupCachePkg&lt;/span&gt;(p); }

        &lt;span style="color: green"&gt;// Field Names in this sample are not very good because we use templates a lot here
        &lt;/span&gt;[&lt;span style="color: #2b91af"&gt;STAThread&lt;/span&gt;]
        &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span style="color: #2b91af"&gt;EzLookupCachePkg &lt;/span&gt;p5 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookupCachePkg&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.MachineName, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;, 
                &lt;span style="color: #a31515"&gt;&amp;quot;select * from HumanResources.EmployeeAddress&amp;quot;&lt;/span&gt;);
            p5.Exec.Transform.Connection.SetIndexCols(&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;);
            p5.LookupDF.Source.SqlCommand = &lt;span style="color: #a31515"&gt;&amp;quot;select * from HumanResources.Employee&amp;quot;&lt;/span&gt;;
            p5.LookupDF.Transform.SetJoinCols(&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID,EmployeeID&amp;quot;&lt;/span&gt;);
            p5.LookupDF.Transform.SetPureCopyCols(&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;);
            p5.LookupDF.Dest.DefineColumnsInCM();
            p5.Exec.Disable = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
            p5.LookupDF.Transform.OleDbConnection = p5.Exec.SrcConn;
            p5.LookupDF.Transform.SqlCommand = p5.Exec.Source.SqlCommand;
            p5.SaveToFile(&lt;span style="color: #a31515"&gt;&amp;quot;demo5.dtsx&amp;quot;&lt;/span&gt;);
            p5.Execute();
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package6 executed with result {0}\n&amp;quot;&lt;/span&gt;, p5.ExecutionResult));
        }

        &lt;span style="color: blue"&gt;private static string &lt;/span&gt;ArrayToString&amp;lt;T&amp;gt;(T[] arr)
        {
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(arr == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;null&amp;quot;&lt;/span&gt;;
            &lt;span style="color: blue"&gt;string &lt;/span&gt;res = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty;
            &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(T el &lt;span style="color: blue"&gt;in &lt;/span&gt;arr)
                res += el.ToString() + &lt;span style="color: #a31515"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;;
            &lt;span style="color: blue"&gt;return &lt;/span&gt;res;
        }
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Here is the created package:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_21.png" width="747" height="595" /&gt; &lt;/p&gt;

&lt;p&gt;Now the question is: what if we want to reuse the package but don’t want cache transform to be built? The answer is – we can easily disable cache dataflow:&lt;/p&gt;

&lt;p&gt;p6.Exec.Disable = true;&lt;/p&gt;

&lt;p&gt;Right after that our package is ready. With case of PackageBuilder – we would have to create a separate builder without cache dataflow task.&lt;/p&gt;

&lt;p&gt;Also pay attention to how easily lookup transform can be configured:&lt;/p&gt;

&lt;p&gt;p6.LookupDF.Transform.SetJoinCols(&amp;quot;EmployeeID,EmployeeKey&amp;quot;, &amp;quot;LoginID,LoginID&amp;quot;);&lt;/p&gt;

&lt;p&gt;p6.LookupDF.Transform.SetPureCopyCols(&amp;quot;EmployeeNationalIDAlternateKey&amp;quot;, &amp;quot;ParentEmployeeNationalIDAlternateKey&amp;quot;, 
  &lt;br /&gt;&amp;quot;FirstName&amp;quot;, &amp;quot;LastName&amp;quot;);

  &lt;br /&gt;This results in the following picture in lookup transform:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_24.png" width="659" height="645" /&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Cross feature packages&lt;/h3&gt;

&lt;p&gt;Another great scenario is packages with multiple transforms in a more sophisticated dataflows. Here is an example of such package:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;ConsoleApplication1
{
    &lt;span style="color: green"&gt;// For EzAPI public fields means that if we assign SSIS Package to EzPackage this field needs
    // to be assigned to the corresponding object inside SSIS package. The corresponding object is an object that has the same EzName as the field name
    // in the class. If you set it to some incorrect value - package logic won't be affected as internally it stores all the Ez components, tasks and connections
    // and uses that internal list to refresh metadata.
    &lt;/span&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzDataFlowPackage
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbSource &lt;/span&gt;Source;
        &lt;span style="color: green"&gt;// Transforms
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookup &lt;/span&gt;Lookup;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform &lt;/span&gt;SortMatch;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform &lt;/span&gt;SortNoMatch;
        &lt;span style="color: green"&gt;// Destinations
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination &lt;/span&gt;MatchDest;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination &lt;/span&gt;NoMatchDest;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination &lt;/span&gt;ErrorDest;
        &lt;span style="color: green"&gt;// Connection managers
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM &lt;/span&gt;RefConn;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM &lt;/span&gt;SrcConn;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM &lt;/span&gt;MatchCM;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM &lt;/span&gt;NoMatchCM;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM &lt;/span&gt;ErrorCM;

        &lt;span style="color: green"&gt;// Provide this constructor only if you want to overload Assignment operator
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;EzMyPackage(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(p) { }  
        &lt;span style="color: green"&gt;// Provide assignment operator if you want to be able to Assign SSIS Package to EzPackage
        &lt;/span&gt;&lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;(p); }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzMyPackage() : &lt;span style="color: blue"&gt;base&lt;/span&gt;()
        {
            &lt;span style="color: green"&gt;// Connection managers
            &lt;/span&gt;SrcConn = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            SrcConn.SetConnectionString(&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.MachineName, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;);
            MatchCM = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            MatchCM.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;matchcm.txt&amp;quot;&lt;/span&gt;;
            NoMatchCM = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            NoMatchCM.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;nomatchcm.txt&amp;quot;&lt;/span&gt;;
            ErrorCM = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            ErrorCM.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;errorcm.txt&amp;quot;&lt;/span&gt;;
            RefConn = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            RefConn.SetConnectionString(&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.MachineName, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;);

            &lt;span style="color: green"&gt;// Creating Dataflow
            &lt;/span&gt;Source = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;(DataFlow);
            Source.Connection = SrcConn;
            Source.SqlCommand = &lt;span style="color: #a31515"&gt;&amp;quot;select * from HumanResources.Employee&amp;quot;&lt;/span&gt;;
            
            Lookup = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookup&lt;/span&gt;(DataFlow);
            Lookup.AttachTo(Source);
            Lookup.OleDbConnection = RefConn;
            Lookup.SqlCommand = &lt;span style="color: #a31515"&gt;&amp;quot;select * from HumanResources.EmployeeAddress&amp;quot;&lt;/span&gt;;
            Lookup.SetJoinCols(&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID,EmployeeID&amp;quot;&lt;/span&gt;);
            Lookup.SetPureCopyCols(&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;);
            Lookup.NoMatchBehavor = &lt;span style="color: #2b91af"&gt;NoMatchBehavior&lt;/span&gt;.SendToNoMatchOutput;
            Lookup.OutputCol(&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;).TruncationRowDisposition = &lt;span style="color: #2b91af"&gt;DTSRowDisposition&lt;/span&gt;.RD_RedirectRow;

            SortMatch = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform&lt;/span&gt;(DataFlow);
            SortMatch.AttachTo(Lookup, 0, 0);
            SortMatch.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID&amp;quot;&lt;/span&gt;] = 1;      &lt;span style="color: green"&gt;// sort in ascending order
            &lt;/span&gt;SortMatch.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;] = -2;      &lt;span style="color: green"&gt;// sort in descending order

            &lt;/span&gt;SortNoMatch = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform&lt;/span&gt;(DataFlow);
            SortNoMatch.AttachTo(Lookup, 1, 0);
            SortNoMatch.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID&amp;quot;&lt;/span&gt;] = 1;      &lt;span style="color: green"&gt;// sort in ascending order

            &lt;/span&gt;ErrorDest = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;(DataFlow);
            ErrorDest.AttachTo(Lookup, 2, 0);
            ErrorDest.Connection = ErrorCM;
            ErrorDest.DefineColumnsInCM();      &lt;span style="color: green"&gt;// configure connection manager to have all input columns defined in the resulting file

            &lt;/span&gt;MatchDest = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;(DataFlow);
            MatchDest.AttachTo(SortMatch);
            MatchDest.Connection = MatchCM;
            MatchDest.DefineColumnsInCM();

            NoMatchDest = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;(DataFlow);
            NoMatchDest.AttachTo(SortNoMatch);
            NoMatchDest.Connection = NoMatchCM;
            NoMatchDest.DefineColumnsInCM();
        }

        [&lt;span style="color: #2b91af"&gt;STAThread&lt;/span&gt;]
        &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span style="color: #2b91af"&gt;EzMyPackage &lt;/span&gt;p = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyPackage&lt;/span&gt;();
            p.Execute();
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package executed with result {0}\n&amp;quot;&lt;/span&gt;, p.ExecutionResult));
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;The result is:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_27.png" width="386" height="366" /&gt; &lt;/p&gt;

&lt;p&gt;As you can see, this relatively complex package is created even without using template possibilities of EzAPI and it the code that creates package (class constructor) is only 50 lines of code. So it took 4 lines per object to create the package. The dtsx file of this package contains more than 1300 lines. &lt;/p&gt;

&lt;h3&gt;Misc scenarios&lt;/h3&gt;

&lt;p&gt;Say we want the dataflow in a previous package to be executed in a loop, but we want a number of those loops concatenated together. Something like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/EzApiAlternativepackagecreationAPI_D8EC/image_30.png" width="376" height="312" /&gt; &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// This demo creates a package with N forloops with dataflow inside executed sequentially
&lt;/span&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;ConsoleApplication1
{
    &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyDataFlow &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzDataFlow
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbSource &lt;/span&gt;Source;
        &lt;span style="color: green"&gt;// Transforms
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookup &lt;/span&gt;Lookup;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform &lt;/span&gt;SortMatch;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform &lt;/span&gt;SortNoMatch;
        &lt;span style="color: green"&gt;// Destinations
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination &lt;/span&gt;MatchDest;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination &lt;/span&gt;NoMatchDest;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination &lt;/span&gt;ErrorDest;
        &lt;span style="color: green"&gt;// Connection managers
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM &lt;/span&gt;RefConn;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM &lt;/span&gt;SrcConn;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM &lt;/span&gt;MatchCM;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM &lt;/span&gt;NoMatchCM;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM &lt;/span&gt;ErrorCM;

        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzMyDataFlow(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent, &lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;pipe) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, pipe) { }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzMyDataFlow(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent)
        {
            &lt;span style="color: green"&gt;// Connection managers
            &lt;/span&gt;SrcConn = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;(Package, &lt;span style="color: #a31515"&gt;&amp;quot;SrcConn&amp;quot;&lt;/span&gt;);
            SrcConn.SetConnectionString(&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.MachineName, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;);
            MatchCM = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;(Package, &lt;span style="color: #a31515"&gt;&amp;quot;MatchCM&amp;quot;&lt;/span&gt;);
            MatchCM.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;matchcm.txt&amp;quot;&lt;/span&gt;;
            NoMatchCM = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;(Package, &lt;span style="color: #a31515"&gt;&amp;quot;NoMatchCM&amp;quot;&lt;/span&gt;);
            NoMatchCM.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;nomatchcm.txt&amp;quot;&lt;/span&gt;;
            ErrorCM = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileCM&lt;/span&gt;(Package, &lt;span style="color: #a31515"&gt;&amp;quot;ErrorCM&amp;quot;&lt;/span&gt;);
            ErrorCM.ConnectionString = &lt;span style="color: #a31515"&gt;&amp;quot;errorcm.txt&amp;quot;&lt;/span&gt;;
            RefConn = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSqlOleDbCM&lt;/span&gt;(Package, &lt;span style="color: #a31515"&gt;&amp;quot;RefConn&amp;quot;&lt;/span&gt;);
            RefConn.SetConnectionString(&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.MachineName, &lt;span style="color: #a31515"&gt;&amp;quot;AdventureWorks&amp;quot;&lt;/span&gt;);

            &lt;span style="color: green"&gt;// Creating Dataflow
            &lt;/span&gt;Source = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbSource&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            Source.Connection = SrcConn;
            Source.SqlCommand = &lt;span style="color: #a31515"&gt;&amp;quot;select * from HumanResources.Employee&amp;quot;&lt;/span&gt;;

            Lookup = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLookup&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            Lookup.AttachTo(Source);
            Lookup.OleDbConnection = RefConn;
            Lookup.SqlCommand = &lt;span style="color: #a31515"&gt;&amp;quot;select * from HumanResources.EmployeeAddress&amp;quot;&lt;/span&gt;;
            Lookup.SetJoinCols(&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID,EmployeeID&amp;quot;&lt;/span&gt;);
            Lookup.SetPureCopyCols(&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;);
            Lookup.NoMatchBehavor = &lt;span style="color: #2b91af"&gt;NoMatchBehavior&lt;/span&gt;.SendToNoMatchOutput;
            Lookup.OutputCol(&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;).TruncationRowDisposition = &lt;span style="color: #2b91af"&gt;DTSRowDisposition&lt;/span&gt;.RD_RedirectRow;

            SortMatch = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            SortMatch.AttachTo(Lookup, 0, 0);
            SortMatch.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID&amp;quot;&lt;/span&gt;] = 1;      &lt;span style="color: green"&gt;// sort in ascending order
            &lt;/span&gt;SortMatch.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;AddressID&amp;quot;&lt;/span&gt;] = -2;     &lt;span style="color: green"&gt;// sort in descending order

            &lt;/span&gt;SortNoMatch = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSortTransform&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            SortNoMatch.AttachTo(Lookup, 1, 0);
            SortNoMatch.SortOrder[&lt;span style="color: #a31515"&gt;&amp;quot;EmployeeID&amp;quot;&lt;/span&gt;] = 1;      &lt;span style="color: green"&gt;// sort in ascending order

            &lt;/span&gt;ErrorDest = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            ErrorDest.AttachTo(Lookup, 2, 0);
            ErrorDest.Connection = ErrorCM;
            ErrorDest.DefineColumnsInCM();      &lt;span style="color: green"&gt;// configure connection manager to have all input columns defined in the resulting file

            &lt;/span&gt;MatchDest = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            MatchDest.AttachTo(SortMatch);
            MatchDest.Connection = MatchCM;
            MatchDest.DefineColumnsInCM();

            NoMatchDest = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFlatFileDestination&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
            NoMatchDest.AttachTo(SortNoMatch);
            NoMatchDest.Connection = NoMatchCM;
            NoMatchDest.DefineColumnsInCM();
        }
    }

    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyLoopPkg &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzPackage
    &lt;/span&gt;{
        &lt;span style="color: #2b91af"&gt;EzExecForLoop&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzMyDataFlow&lt;/span&gt;&amp;gt;[] Loops;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;EzMyLoopPkg(&lt;span style="color: blue"&gt;int &lt;/span&gt;numLoops) : &lt;span style="color: blue"&gt;base&lt;/span&gt;()
        {
            Variables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;i&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, 0);
            Loops = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecForLoop&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzMyDataFlow&lt;/span&gt;&amp;gt;[numLoops];
            &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; numLoops; i++)
            {
                Loops[i] = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecForLoop&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EzMyDataFlow&lt;/span&gt;&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
                Loops[i].InitExpression = &lt;span style="color: #a31515"&gt;&amp;quot;@i=0&amp;quot;&lt;/span&gt;;
                Loops[i].EvalExpression = &lt;span style="color: #a31515"&gt;&amp;quot;@i&amp;lt;10&amp;quot;&lt;/span&gt;;
                Loops[i].AssignExpression = &lt;span style="color: #a31515"&gt;&amp;quot;@i=@i+1&amp;quot;&lt;/span&gt;;
            }
            &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 1; i &amp;lt; numLoops; i++)
                Loops[i].AttachTo(Loops[i-1]);
        }

        &lt;span style="color: blue"&gt;public static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span style="color: #2b91af"&gt;EzMyLoopPkg &lt;/span&gt;p = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzMyLoopPkg&lt;/span&gt;(5);
            p.SaveToFile(&lt;span style="color: #a31515"&gt;&amp;quot;demo7.dtsx&amp;quot;&lt;/span&gt;);
            p.Execute();
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Package executed with result {0}\n&amp;quot;&lt;/span&gt;, p.ExecutionResult));
        }
    }
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Note that in this example we reuse dataflow task in multiple loops. But only one instance of connection managers is created. This happens because EzAPI creates multiple wrappers for connection managers, but doesn’t duplicate connection managers themselves.&lt;/p&gt;

&lt;h2&gt;Extending EzAPI&lt;/h2&gt;

&lt;p&gt;Main types of objects currently supported by EzAPI are tasks, containers, packages, dataflow components, and connection managers. Let’s review how to extend EzAPI power by developing new EzObjects.&lt;/p&gt;

&lt;h3&gt;Developing Pipeline Components&lt;/h3&gt;

&lt;p&gt;The base class for all components is EzComponent. Let review how to create components using OleDBCommand transform as example. OleDBCommand has a lot of common with destination type of transforms. It requires mapping of input column to external metadata columns. That’s why we’ll use EzAdapter class as a base class. EzAdapter is a base class for all source and destination adapters.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// This attribute is mandatory. It should return GUID of the native component, of full type name 
// of the  managed component
&lt;/span&gt;[&lt;span style="color: #2b91af"&gt;CompID&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;{8E61C8F6-C91D-43B6-97EB-3423C06571CC}&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzOleDbCommand &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzAdapter
&lt;/span&gt;{
    &lt;span style="color: green"&gt;// These two constructors are mandatory. The first one creates new component in SSIS dataflow
    // The second one creates wrapper for the existing one
    &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;EzOleDbCommand(&lt;span style="color: #2b91af"&gt;EzDataFlow &lt;/span&gt;dataFlow) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(dataFlow) { }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzOleDbCommand(&lt;span style="color: #2b91af"&gt;EzDataFlow &lt;/span&gt;parent, &lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;meta) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, meta) { }

    &lt;span style="color: green"&gt;// The third thing that is necessary is to declare properties specific to your component. 
    // Mostly they will look like the three properties above
    &lt;/span&gt;&lt;span style="color: blue"&gt;public int &lt;/span&gt;CommandTimeout
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;int&lt;/span&gt;)m_meta.CustomPropertyCollection[&lt;span style="color: #a31515"&gt;&amp;quot;CommandTimeout&amp;quot;&lt;/span&gt;].Value; }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ m_comp.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;CommandTimeout&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;value&lt;/span&gt;); ReinitializeMetaData(); }
    }

    &lt;span style="color: blue"&gt;public int &lt;/span&gt;DefaultCodePage
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;int&lt;/span&gt;)m_meta.CustomPropertyCollection[&lt;span style="color: #a31515"&gt;&amp;quot;DefaultCodePage&amp;quot;&lt;/span&gt;].Value; }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ m_comp.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;DefaultCodePage&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;SqlCommand
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)m_meta.CustomPropertyCollection[&lt;span style="color: #a31515"&gt;&amp;quot;SqlCommand&amp;quot;&lt;/span&gt;].Value; }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ m_comp.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;SqlCommand&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;value&lt;/span&gt;); ReinitializeMetaData(); }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Another example is DataConvert. Here is the code for it:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;CompID&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;{BD06A22E-BC69-4AF7-A69B-C44C2EF684BB}&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzDataConvert &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzComponent
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzDataConvert(&lt;span style="color: #2b91af"&gt;EzDataFlow &lt;/span&gt;dataFlow) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(dataFlow) { }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzDataConvert(&lt;span style="color: #2b91af"&gt;EzDataFlow &lt;/span&gt;parent, &lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;meta) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, meta) { }

    &lt;span style="color: green"&gt;// This function sets convertion if inputColumn to the column with the specified datatype
    &lt;/span&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;Convert(&lt;span style="color: blue"&gt;string &lt;/span&gt;inColName, &lt;span style="color: blue"&gt;string &lt;/span&gt;newColName, &lt;span style="color: #2b91af"&gt;DataType &lt;/span&gt;dataType, &lt;span style="color: blue"&gt;int &lt;/span&gt;length, &lt;span style="color: blue"&gt;int &lt;/span&gt;precision, &lt;span style="color: blue"&gt;int &lt;/span&gt;scale, &lt;span style="color: blue"&gt;int &lt;/span&gt;codePage)
    {
        LinkInputToOutput(inColName);
        SetOutputColumnProperty(newColName, &lt;span style="color: #a31515"&gt;&amp;quot;SourceInputColumnLineageID&amp;quot;&lt;/span&gt;, InputCol(inColName).LineageID);
        SetOutputColumnDataTypeProperties(newColName, dataType, length, precision, scale, codePage);
    }

    &lt;span style="color: green"&gt;// returns name of converted output column that corresponds to the specified input column
    &lt;/span&gt;&lt;span style="color: blue"&gt;public string &lt;/span&gt;ConvertedColumn(&lt;span style="color: blue"&gt;string &lt;/span&gt;inputColName)
    {
        &lt;span style="color: blue"&gt;int &lt;/span&gt;lineageId = InputCol(inputColName).LineageID;
        &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IDTSOutputColumn100 &lt;/span&gt;c &lt;span style="color: blue"&gt;in &lt;/span&gt;Meta.OutputCollection[0].OutputColumnCollection)
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(OutputColumnPropertyExists(c.Name, &lt;span style="color: #a31515"&gt;&amp;quot;SourceInputColumnLineageID&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp; 
                (&lt;span style="color: blue"&gt;int&lt;/span&gt;)c.CustomPropertyCollection[&lt;span style="color: #a31515"&gt;&amp;quot;SourceInputColumnLineageID&amp;quot;&lt;/span&gt;].Value == lineageId)
            {
                &lt;span style="color: blue"&gt;return &lt;/span&gt;c.Name;
            }
        &lt;span style="color: blue"&gt;return null&lt;/span&gt;;
    }

    &lt;span style="color: green"&gt;// FastParse property set for the specified converted column
    &lt;/span&gt;&lt;span style="color: blue"&gt;protected &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ColumnCustomPropertyIndexer&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt; m_fastParse;
    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ColumnCustomPropertyIndexer&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt; FastParse
    {
        &lt;span style="color: blue"&gt;get
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(m_fastParse == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                m_fastParse = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ColumnCustomPropertyIndexer&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;FastParse&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IndexerType&lt;/span&gt;.Output, &lt;span style="color: blue"&gt;false&lt;/span&gt;);
            &lt;span style="color: blue"&gt;return &lt;/span&gt;m_fastParse;
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;This code is pretty straightforward and easy to understand if you are familiar with DataConvert component. The whole implementation took about 40 lines. Note that normally implementation of custom component simply includes exposing custom properties of component and, if necessary, input/output columns (like FastParse in DataConvert).&lt;/p&gt;

&lt;h3&gt;Developing Runtime Tasks&lt;/h3&gt;

&lt;p&gt;The base class for tasks is EzTask. To illustrate the process of task development let’s take ExecutePackage Task as an example.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// This attribute should be declared and return either Moniker, or full managed type name 
&lt;/span&gt;[&lt;span style="color: #2b91af"&gt;ExecID&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;SSIS.ExecutePackageTask.2&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecPackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzTask
&lt;/span&gt;{
    &lt;span style="color: green"&gt;// These two constructors are mandatory. The first one creates new task in SSIS control flow
    // The second one creates wrapper for the existing one
    &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;EzExecPackage(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent) { }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzExecPackage(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent, &lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;task) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, task) { }

    &lt;span style="color: green"&gt;// Now declare properties. In most cases they will look similar to the properties below
    &lt;/span&gt;&lt;span style="color: blue"&gt;public bool &lt;/span&gt;ExecOutOfProcess
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;bool&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ExecuteOutOfProcess&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ExecuteOutOfProcess&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;PackageName
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;PackageName&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;PackageName&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;PackagePassword
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;PackagePassword&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;PackagePassword&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;PackageID
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;PackageID&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;PackageID&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;VersionID
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;VersionID&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;VersionID&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: green"&gt;// We can only accept OLEDB or FILE connection managers.
    &lt;/span&gt;&lt;span style="color: blue"&gt;protected &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzConnectionManager &lt;/span&gt;m_connection;
    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzConnectionManager &lt;/span&gt;Connection
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;m_connection; }
        &lt;span style="color: blue"&gt;set
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;value &lt;/span&gt;== &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;value&lt;/span&gt;.CM.CreationName != &lt;span style="color: #a31515"&gt;&amp;quot;FILE&amp;quot; &lt;/span&gt;&amp;amp;&amp;amp; &lt;span style="color: blue"&gt;value&lt;/span&gt;.CM.CreationName != &lt;span style="color: #a31515"&gt;&amp;quot;OLEDB&amp;quot;&lt;/span&gt;)
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IncorrectAssignException&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Cannot assign {0} connection to EzExecPackage task&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;value&lt;/span&gt;.CM.CreationName));
            (host.InnerObject &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSExecutePackage100&lt;/span&gt;).Connection = &lt;span style="color: blue"&gt;value&lt;/span&gt;.Name;
            m_connection = &lt;span style="color: blue"&gt;value&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;In case of managed task everything looks pretty similar, except that ExecID returns full managed type name:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;ExecID&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Microsoft.SqlServer.Dts.Tasks.ActiveXScriptTask.ActiveXScriptTask, Microsoft.SqlServer.ActiveXScriptTask, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzActiveXScript &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzTask
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzActiveXScript(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent) { EntryMethod = &lt;span style="color: #a31515"&gt;&amp;quot;Main&amp;quot;&lt;/span&gt;; ScriptingLanguage = &lt;span style="color: #a31515"&gt;&amp;quot;VBScript&amp;quot;&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzActiveXScript(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent, &lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;task) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, task) { }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;EntryMethod
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;EntryMethod&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;EntryMethod&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;ExecValueVariable
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ExecValueVariable&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ExecValueVariable&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;ScriptingLanguage
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ScriptingLanguage&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ScriptingLanguage&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;ScriptText
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ScriptText&amp;quot;&lt;/span&gt;].GetValue(host); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ host.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ScriptText&amp;quot;&lt;/span&gt;].SetValue(host, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;h3&gt;Developing containers and packages&lt;/h3&gt;

&lt;p&gt;The base class for containers is EzContainer. Here is how EzForLoop container can be implemented:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;ExecID&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;STOCK:FORLOOP&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzForLoop &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzContainer
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzForLoop(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent, &lt;span style="color: #2b91af"&gt;DtsContainer &lt;/span&gt;c) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, c) { }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzForLoop(&lt;span style="color: #2b91af"&gt;EzContainer &lt;/span&gt;parent) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent) { RecreateExecutables(); }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;AssignExpression
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(m_exec &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ForLoop&lt;/span&gt;).AssignExpression; }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ (m_exec &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ForLoop&lt;/span&gt;).AssignExpression = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;EvalExpression
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(m_exec &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ForLoop&lt;/span&gt;).EvalExpression; }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ (m_exec &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ForLoop&lt;/span&gt;).EvalExpression = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }
    }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;InitExpression
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(m_exec &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ForLoop&lt;/span&gt;).InitExpression; }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ (m_exec &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ForLoop&lt;/span&gt;).InitExpression = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;All packages derive from EzPackage class, which derives from EzContainer. Here is how a package with dataflow task can be created:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzDataFlowPackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzPackage
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzDataFlow &lt;/span&gt;DataFlow;

    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzDataFlowPackage() : &lt;span style="color: blue"&gt;base&lt;/span&gt;() { DataFlow = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzDataFlow&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;); }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzDataFlowPackage(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(p) { }

    &lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzDataFlowPackage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;p) { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzDataFlowPackage&lt;/span&gt;(p); }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;h3&gt;Developing Connection Managers&lt;/h3&gt;

&lt;p&gt;Connection managers in EzAPI derive from EzConnectionManager class.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public enum &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FileUsageType &lt;/span&gt;: &lt;span style="color: blue"&gt;int
&lt;/span&gt;{
    ExistingFile = 0,
    CreateFile = 1,
    ExistingFolder = 2,
    CreateFolder = 3
}

[&lt;span style="color: #2b91af"&gt;ConnMgrID&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;FILE&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzFileCM&lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzConnectionManager
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzFileCM(&lt;span style="color: #2b91af"&gt;EzPackage &lt;/span&gt;parent) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent) { }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzFileCM(&lt;span style="color: #2b91af"&gt;EzPackage &lt;/span&gt;parent, &lt;span style="color: #2b91af"&gt;ConnectionManager &lt;/span&gt;c) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, c) { }
    &lt;span style="color: blue"&gt;public &lt;/span&gt;EzFileCM(&lt;span style="color: #2b91af"&gt;EzPackage &lt;/span&gt;parent, &lt;span style="color: blue"&gt;string &lt;/span&gt;name) : &lt;span style="color: blue"&gt;base&lt;/span&gt;(parent, name) { }

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;DataSourceID
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)m_conn.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;DataSourceID&amp;quot;&lt;/span&gt;].GetValue(m_conn); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ m_conn.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;DataSourceID&amp;quot;&lt;/span&gt;].SetValue(m_conn, &lt;span style="color: blue"&gt;value&lt;/span&gt;); Parent.ReinitializeMetaData(); }
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FileUsageType &lt;/span&gt;FileUsageType
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;FileUsageType&lt;/span&gt;)m_conn.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;FileUsageType&amp;quot;&lt;/span&gt;].GetValue(m_conn); }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ m_conn.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;FileUsageType&amp;quot;&lt;/span&gt;].SetValue(m_conn, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }
    }
}&lt;/pre&gt;

&lt;h2&gt;Implemented SSIS objects&lt;/h2&gt;

&lt;h3&gt;&lt;a name="_Toc213055190"&gt;Tasks and Containers&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;For Loop container&lt;/li&gt;

  &lt;li&gt;DataFlow Task&lt;/li&gt;

  &lt;li&gt;Execute Package Task&lt;/li&gt;

  &lt;li&gt;ActiveX Script Task&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;DataFlow Components&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;OLEDB Source&lt;/li&gt;

  &lt;li&gt;OLEDB Destination&lt;/li&gt;

  &lt;li&gt;FlatFile Source&lt;/li&gt;

  &lt;li&gt;FlatFile Destination&lt;/li&gt;

  &lt;li&gt;ADO.Net Source&lt;/li&gt;

  &lt;li&gt;ADO.Net Destination&lt;/li&gt;

  &lt;li&gt;Multicast Transform&lt;/li&gt;

  &lt;li&gt;Derived Column Transform&lt;/li&gt;

  &lt;li&gt;Sort Transform&lt;/li&gt;

  &lt;li&gt;OLEDB command Transform&lt;/li&gt;

  &lt;li&gt;Lookup Transform&lt;/li&gt;

  &lt;li&gt;Cache Transform&lt;/li&gt;

  &lt;li&gt;Data Convert Transform&lt;/li&gt;

  &lt;li&gt;Aggregate Transform&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Connection Managers&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;OLEDB Connection manager (including specific versions for SQL Server, Oracle, DB2)&lt;/li&gt;

  &lt;li&gt;FILE connection manager&lt;/li&gt;

  &lt;li&gt;FLATFILE connection manager&lt;/li&gt;

  &lt;li&gt;CACHE connection manager&lt;/li&gt;

  &lt;li&gt;ADO.NET connection manager&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Using template collections&lt;/h2&gt;

&lt;p&gt;Currently EzAPI framework includes a number of classes that can make development of packages even easier. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzDataFlowPackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzPackage&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Package with single dataflow task without any connection managers&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzForLoopDFPackage &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;EzForLoopPackage&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Package with single ForLoop container with Dataflow task in it without any connection managers&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSrcPackage&lt;/span&gt;&amp;lt;SrcType, SrcConnType&amp;gt; : &lt;span style="color: #2b91af"&gt;EzDataFlowPackage
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcType : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcConnType : &lt;span style="color: #2b91af"&gt;EzConnectionManager&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Package with single dataflow task that contains only source of SrcType and connection manager of type SrcConnType used by this source&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSrcDestPackage&lt;/span&gt;&amp;lt;SrcType, SrcConnType, DestType, DestConnType&amp;gt; : &lt;span style="color: #2b91af"&gt;EzSrcPackage&lt;/span&gt;&amp;lt;SrcType, SrcConnType&amp;gt;
    &lt;span style="color: blue"&gt;where &lt;/span&gt;SrcType : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcConnType : &lt;span style="color: #2b91af"&gt;EzConnectionManager
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestType : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestConnType : &lt;span style="color: #2b91af"&gt;EzConnectionManager&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Package with single dataflow task that contains source-&amp;gt;destination dataflow and their connection managers. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzTransformPackage&lt;/span&gt;&amp;lt;SrcType, SrcConnType, TransType, DestType, DestConnType&amp;gt;
    : &lt;span style="color: #2b91af"&gt;EzSrcPackage&lt;/span&gt;&amp;lt;SrcType, SrcConnType&amp;gt;
    &lt;span style="color: blue"&gt;where &lt;/span&gt;SrcType : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcConnType : &lt;span style="color: #2b91af"&gt;EzConnectionManager
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;TransType : &lt;span style="color: #2b91af"&gt;EzComponent
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestType : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestConnType : &lt;span style="color: #2b91af"&gt;EzConnectionManager&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Package with single dataflow task that contains source-&amp;gt;transform-&amp;gt;destination and connection managers for source and destination. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzLoopTransformPackage&lt;/span&gt;&amp;lt;SrcType, SrcConnType, TransType, DestType, DestConnType&amp;gt;
    : &lt;span style="color: #2b91af"&gt;EzForLoopDFPackage
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcType : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcConnType : &lt;span style="color: #2b91af"&gt;EzConnectionManager
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;TransType : &lt;span style="color: #2b91af"&gt;EzComponent
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestType : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestConnType : &lt;span style="color: #2b91af"&gt;EzConnectionManager&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Package with single dataflow task that contains source-&amp;gt;transform-&amp;gt;destination and connection managers for source and destination. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzPkgWithExec&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;EzPackage &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;T : &lt;span style="color: #2b91af"&gt;EzExecutable&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Package with a single executable (task or container) &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzExecForLoop&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;EzForLoop &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;T : &lt;span style="color: #2b91af"&gt;EzExecutable&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Package with a single executable (task or container) in a for loop container&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSrcDF&lt;/span&gt;&amp;lt;SrcComp&amp;gt; : &lt;span style="color: #2b91af"&gt;EzDataFlow &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcComp : &lt;span style="color: #2b91af"&gt;EzComponent&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Dataflow with some source component&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzSrcConnDF&lt;/span&gt;&amp;lt;SrcComp, SrcCM&amp;gt; : &lt;span style="color: #2b91af"&gt;EzSrcDF&lt;/span&gt;&amp;lt;SrcComp&amp;gt;
    &lt;span style="color: blue"&gt;where &lt;/span&gt;SrcComp : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcCM : &lt;span style="color: #2b91af"&gt;EzConnectionManager&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Dataflow with some source component with connection manager&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzTransformDF&lt;/span&gt;&amp;lt;SrcComp, SrcCM, Trans&amp;gt; : &lt;span style="color: #2b91af"&gt;EzSrcConnDF&lt;/span&gt;&amp;lt;SrcComp, SrcCM&amp;gt;
    &lt;span style="color: blue"&gt;where &lt;/span&gt;SrcComp : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcCM : &lt;span style="color: #2b91af"&gt;EzConnectionManager
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;Trans : &lt;span style="color: #2b91af"&gt;EzComponent&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzTransDestDF&lt;/span&gt;&amp;lt;SrcComp, SrcCM, Trans, DestComp&amp;gt; : &lt;span style="color: #2b91af"&gt;EzTransformDF&lt;/span&gt;&amp;lt;SrcComp, SrcCM, Trans&amp;gt;
    &lt;span style="color: blue"&gt;where &lt;/span&gt;SrcComp : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcCM : &lt;span style="color: #2b91af"&gt;EzConnectionManager
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;Trans : &lt;span style="color: #2b91af"&gt;EzComponent
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestComp : &lt;span style="color: #2b91af"&gt;EzComponent&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Dataflow with some source component with connection manager, transformation and destination without connection manager&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EzTransDestConnDF&lt;/span&gt;&amp;lt;SrcComp, SrcCM, Trans, DestComp, DestCM&amp;gt; : &lt;span style="color: #2b91af"&gt;EzTransDestDF&lt;/span&gt;&amp;lt;SrcComp, SrcCM, Trans, DestComp&amp;gt;
    &lt;span style="color: blue"&gt;where &lt;/span&gt;SrcComp : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;SrcCM : &lt;span style="color: #2b91af"&gt;EzConnectionManager
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;Trans : &lt;span style="color: #2b91af"&gt;EzComponent
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestComp : &lt;span style="color: #2b91af"&gt;EzAdapter
    &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;DestCM : &lt;span style="color: #2b91af"&gt;EzConnectionManager&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Dataflow with some source component with connection manager, transformation and destination with connection manager.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9257631" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>API Sample - Create a package with a data flow task</title><link>http://blogs.msdn.com/mattm/archive/2008/12/30/create-a-package-with-a-data-flow-task.aspx</link><pubDate>Wed, 31 Dec 2008 00:01:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9257609</guid><dc:creator>mmasson</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9257609.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9257609</wfw:commentRss><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;This code creates a package with a single data flow task. It will be used as a base for the more complicated code samples.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;package = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Package&lt;/span&gt;();

    &lt;span style="color: green"&gt;// Add Data Flow Task
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Executable &lt;/span&gt;dataFlowTask = package.Executables.Add(&lt;span style="color: #a31515"&gt;&amp;quot;STOCK:PipelineTask&amp;quot;&lt;/span&gt;);

    &lt;span style="color: green"&gt;// Set the name (otherwise it will be a random GUID value)
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost = dataFlowTask &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost&lt;/span&gt;;
    taskHost.Name = &lt;span style="color: #a31515"&gt;&amp;quot;Data Flow Task&amp;quot;&lt;/span&gt;;

    &lt;span style="color: green"&gt;// We need a reference to the InnerObject to add items to the data flow
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe &lt;/span&gt;pipeline = taskHost.InnerObject &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainPipe&lt;/span&gt;;
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9257609" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>New SSIS community samples</title><link>http://blogs.msdn.com/mattm/archive/2008/08/19/new-ssis-community-samples.aspx</link><pubDate>Tue, 19 Aug 2008 19:56:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8879210</guid><dc:creator>mmasson</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mattm/comments/8879210.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=8879210</wfw:commentRss><description>&lt;p&gt;Some new samples have been added to the &lt;a href="http://www.codeplex.com/SQLSrvIntegrationSrv/Release/ProjectReleases.aspx?ReleaseId=15424"&gt;SSIS community samples project&lt;/a&gt; on &lt;a href="http://www.codeplex.com/"&gt;codeplex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Delimited Flat File Reader&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This data flow source component is capable of parsing delimited flat files, including files with rows that are missing columns.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Package Generation Sample&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This standalone executable shows how to use the SSIS object model to do schema-based dynamic package generation. It works with SQL Server, Excel and Flat Files as source / destinations. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Hello World Task Sample&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is the sample that I &lt;a href="http://blogs.msdn.com/mattm/archive/2008/07/18/creating-a-custom-task-with-a-default-ui.aspx"&gt;previously blogged about&lt;/a&gt;. It’s a simple Hello World type task that shows how to extend the base task UI classes.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SharePoint List Adapters&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This sample contains data flow source and destination components that demonstrate how to get data in and out of &lt;a href="http://www.microsoft.com/sharepoint/prodinfo/what.mspx"&gt;SharePoint&lt;/a&gt; lists. I’ve seen a lot of requests for this one! &lt;/p&gt;  &lt;p&gt;Note, all of the samples are available as binaries, and as source. We’re going to continue adding to the list, so if you have any ideas of what you’d like to see, feel free to send them to me.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8879210" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category></item><item><title>Regular Expression Flat File Source</title><link>http://blogs.msdn.com/mattm/archive/2008/07/23/regular-expression-flat-file-source.aspx</link><pubDate>Thu, 24 Jul 2008 06:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8768590</guid><dc:creator>mmasson</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mattm/comments/8768590.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=8768590</wfw:commentRss><description>&lt;P&gt;The RegEx flat file source is one of the new &lt;A href="http://www.codeplex.com/SQLSrvIntegrationSrv" mce_href="http://www.codeplex.com/SQLSrvIntegrationSrv"&gt;community samples&lt;/A&gt; for SQL Server 2008 we’ve published to Codeplex. It uses &lt;A href="http://msdn.microsoft.com/en-us/library/hs600312.aspx" mce_href="http://msdn.microsoft.com/en-us/library/hs600312.aspx"&gt;regular expressions&lt;/A&gt; to extract values from a text file. It works similar to the flat file source, except that it’s not limited to CSV-type files (I saw a demo where the developer who created the sample used it to extract class names from a source files). &lt;/P&gt;
&lt;P&gt;Note, when I ran the installer for the sample, it didn’t put the RegExFlatFileSource.dll file under 100\DTS\PipelineComponents. It only put the source down. We’ll either update the installer, or update the docs on the site. To get the component, I opened the project in Visual Studio, and ran a build. The project has a post build step which places the DLL under the PipelineComponents directory, and runs gacutil.exe to place it in the GAC. &lt;/P&gt;
&lt;P&gt;Once the sample is installed, you can add it to your toolbar in Visual Studio.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_2.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=116 alt=image src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb.png" width=209 border=0 mce_src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb.png"&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We’ll start off with a simple flat file example. My data looks like this:&lt;/P&gt;
&lt;P&gt;value 1,1,2001-01-01 &lt;BR&gt;value 2,2,2002-02-02 &lt;BR&gt;value 3,3,2003-03-03 &lt;BR&gt;value 4,4,2004-04-04 &lt;BR&gt;value 5,5,2005-05-05 &lt;BR&gt;value 6,6,2006-06-06 &lt;BR&gt;value 7,7,2007-07-07 &lt;BR&gt;value 8,8,2008-08-08&lt;/P&gt;
&lt;P&gt;Columns are defined using &lt;A href="http://msdn.microsoft.com/en-us/library/bs2twtah.aspx" mce_href="http://msdn.microsoft.com/en-us/library/bs2twtah.aspx"&gt;groups&lt;/A&gt;. If I want the component to behave like a regular CSV parser, I can use a regular expression like this:&lt;/P&gt;
&lt;P&gt;(\w+),(\w+),(\w+)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_6.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=361 alt=image src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_2.png" width=484 border=0 mce_src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;If I click on the Column Mappings tab, I can see four columns have been defined.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_4.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=139 alt=image src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_1.png" width=124 border=0 mce_src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Like with regular expression matches, the first match (column 0) is the entire pattern (which is the whole line in this case). The next three columns are the groups I defined in my regex.&lt;/P&gt;
&lt;P&gt;I can also provide default names for my columns by naming the groups. This regex is a little more specific, and adds names to the groups using the ?&amp;lt;name&amp;gt; syntax supported by .NET. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;(?&amp;lt;text&amp;gt;.*?),(?&amp;lt;number&amp;gt;\d),(?&amp;lt;date&amp;gt;\d{4}-\d{2}-\d{2})&lt;/P&gt;
&lt;P&gt;If I look back at the Column Mappings tab, I can see the columns now have names.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_10.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=139 alt=image src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_4.png" width=124 border=0 mce_src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_4.png"&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You’ll notice that the component provides two outputs – one for rows that match the pattern, and one for rows that don’t match. The non-matching row output will always have a single string column which contains the entire line.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_8.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=236 alt=image src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_3.png" width=385 border=0 mce_src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Adding a data viewer to the Match output, I can see all of the column matches it made:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_12.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=228 alt=image src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_5.png" width=484 border=0 mce_src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/RegularExpressionFlatFIleSource_111B1/image_thumb_5.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I really like this sample because it opens up a lot of data sources, like log files, that used to require custom parsing using a script component. I think it has a lot of potential!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8768590" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category></item><item><title>First two community samples for 2008 now on Codeplex</title><link>http://blogs.msdn.com/mattm/archive/2008/07/23/first-two-community-samples-for-2008-now-on-codeplex.aspx</link><pubDate>Thu, 24 Jul 2008 01:34:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8767897</guid><dc:creator>mmasson</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mattm/comments/8767897.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=8767897</wfw:commentRss><description>&lt;p&gt;The &lt;a href="http://www.codeplex.com/SQLSrvIntegrationSrv"&gt;Integration Services Community Samples project&lt;/a&gt; is now active on Codeplex. These samples are being created by the SSIS product team to supplement the content in books online, and the &lt;a href="http://www.codeplex.com/MSFTISProdSamples/"&gt;Product Samples for 2008&lt;/a&gt;. They will (hopefully) provide useful functionality that you can then take an customize for your ETL solutions. &lt;/p&gt;  &lt;p&gt;The first two samples are pipeline components. We have an XML Destination, which takes one or more input streams and outputs XML documents, and a RegEx Flat File Source, which allows you to parse flat files using regular expressions. &lt;/p&gt;  &lt;p&gt;From the &lt;a href="http://www.codeplex.com/SQLSrvIntegrationSrv/Release/ProjectReleases.aspx?ReleaseId=15424"&gt;releases page&lt;/a&gt;:&lt;/p&gt;  &lt;h2&gt;XML Destination&lt;/h2&gt;  &lt;p&gt;This sample includes source and binary for a simple XML Destination pipeline component. Use this sample to learn more about how to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create custom data flow destination components for use with SSIS &lt;/li&gt;    &lt;li&gt;Build component user interfaces &lt;/li&gt;    &lt;li&gt;Support multiple inputs on a single component &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Regular Expression Flat File Source&lt;/h2&gt;  &lt;p&gt;This sample includes source and binary for a regular expression based flat file parsing source. Use this sample to learn more about how to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create custom data flow sources components for use with SSIS &lt;/li&gt;    &lt;li&gt;Support multiple outputs from a single component &lt;/li&gt;    &lt;li&gt;Define output columns &lt;/li&gt;    &lt;li&gt;Validate metadata &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These components are pretty easy to use, but I’ll follow up with a couple of posts (with screen shots!!@) that show how to use them.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8767897" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/Katmai/default.aspx">Katmai</category></item><item><title>Creating a custom task with a default UI</title><link>http://blogs.msdn.com/mattm/archive/2008/07/18/creating-a-custom-task-with-a-default-ui.aspx</link><pubDate>Sat, 19 Jul 2008 04:20:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8752636</guid><dc:creator>mmasson</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mattm/comments/8752636.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=8752636</wfw:commentRss><description>&lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/ms136080.aspx"&gt;Developing a User Interface for a Custom Task&lt;/a&gt; entry in Books Online describes how to build your UI from scratch, but there is an easier way to create a UI that has the same look and feel as the stock tasks that ship with SSIS. &lt;/p&gt;  &lt;p&gt;The Microsoft.DataTransformationServices.Controls assembly exposes a base class that most of the stock SSIS tasks inherit from – &lt;strong&gt;DTSBaseTaskUI&lt;/strong&gt;. With minimal coding, you too can have a beautiful Task UI (that looks something like this:)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/Creatingacustomtask_A5FF/image_4.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="454" alt="image" src="http://blogs.msdn.com/blogfiles/mattm/WindowsLiveWriter/Creatingacustomtask_A5FF/image_thumb_1.png" width="537" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After &lt;a href="http://msdn.microsoft.com/en-us/library/ms135896.aspx"&gt;creating your task&lt;/a&gt;, you can link it to a UI assembly using the UITypeName parameter of the DtsTask property. The recommended practice is to create a separate assembly for your UI to separate the UI code from the code that gets loaded at runtime, but this is optional. It can all work in the same assembly as well.&lt;/p&gt;  &lt;p&gt;We’re going to create three classes for our “HelloWorldTask”&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;HelloWorldTaskUI – Implements &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.design.idtstaskui.aspx"&gt;IDtsTaskUI&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;HelloWorldTaskMainWnd – Extends DTSBaseTaskUI&lt;/li&gt;    &lt;li&gt;GeneralView – Implements IDTSTaskUIView&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;HelloWorldTaskUI is the entry point for the UI functionality, and is responsible for initializing and displaying your UI. &lt;/p&gt;  &lt;p&gt;Extending DTSBaseTaskUI in HelloWorldTaskMainWnd gives you the form in the screen shot above. Each page of properties you want to display is a separate class that implements IDTSTaskUIView. You get the “Expressions” page for free.&lt;/p&gt;  &lt;p&gt;Let’s walk through what you need to do.&lt;/p&gt;  &lt;p&gt;First you’ll need to add some additional references:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft.DataTransformationServices.Controls&lt;/li&gt;    &lt;li&gt;Microsoft.SqlServer.Dts.Design&lt;/li&gt;    &lt;li&gt;System.Drawing&lt;/li&gt;    &lt;li&gt;System.Windows.Forms&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Note, that Microsoft.DataTransformationServices.Controls.dll is in the GAC, but doesn’t show up in the “.NET” tab of the “Add Reference…” dialog.&lt;/p&gt;  &lt;p&gt;Add new User Control – GeneralView.cs. On the designer, add a property grid. To keep the same look and feel as other SSIS tasks, the InitializeComponents() should look something like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: green"&gt;// 
// propertyGrid
// 
&lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.Dock = System.Windows.Forms.&lt;span style="color: #2b91af"&gt;DockStyle&lt;/span&gt;.Fill;
&lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.Location = &lt;span style="color: blue"&gt;new &lt;/span&gt;System.Drawing.&lt;span style="color: #2b91af"&gt;Point&lt;/span&gt;(0, 0);
&lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.Name = &lt;span style="color: #a31515"&gt;&amp;quot;propertyGrid&amp;quot;&lt;/span&gt;;
&lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.PropertySort = System.Windows.Forms.&lt;span style="color: #2b91af"&gt;PropertySort&lt;/span&gt;.Categorized;
&lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.Size = &lt;span style="color: blue"&gt;new &lt;/span&gt;System.Drawing.&lt;span style="color: #2b91af"&gt;Size&lt;/span&gt;(150, 150);
&lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.TabIndex = 0;
&lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.ToolbarVisible = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;In your GeneralView class, define an internal class which contains all of the properties you’d like to display in the UI – ie. GeneralViewNode&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GeneralViewNode
&lt;/span&gt;{
    &lt;span style="color: green"&gt;// Properties variables
    &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;displayText = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty;
    &lt;span style="color: blue"&gt;private string &lt;/span&gt;name = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty;
    &lt;span style="color: blue"&gt;private string &lt;/span&gt;description = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty;

    &lt;span style="color: blue"&gt;internal &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
    &lt;span style="color: blue"&gt;internal &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDtsConnectionService &lt;/span&gt;connectionService = &lt;span style="color: blue"&gt;null&lt;/span&gt;;

    &lt;span style="color: blue"&gt;internal &lt;/span&gt;GeneralViewNode(&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost, &lt;span style="color: #2b91af"&gt;IDtsConnectionService &lt;/span&gt;connectionService)
    {
        &lt;span style="color: blue"&gt;this&lt;/span&gt;.taskHost = taskHost;
        &lt;span style="color: blue"&gt;this&lt;/span&gt;.connectionService = connectionService;

        &lt;span style="color: green"&gt;// Extract common values from the Task Host
        &lt;/span&gt;name = taskHost.Name;
        description = taskHost.Description;

        &lt;span style="color: green"&gt;// Extract values from the task object
        &lt;/span&gt;HelloWorldTask.&lt;span style="color: #2b91af"&gt;HelloWorldTask &lt;/span&gt;task = taskHost.InnerObject &lt;span style="color: blue"&gt;as &lt;/span&gt;HelloWorldTask.&lt;span style="color: #2b91af"&gt;HelloWorldTask&lt;/span&gt;;
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(task == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color: blue"&gt;string &lt;/span&gt;msg = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Type mismatch for taskHost inner object.&amp;quot;&lt;/span&gt;);
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;(msg);
        }

        displayText = task.DisplayText;
    }

    &lt;span style="color: blue"&gt;#region &lt;/span&gt;Properties

    [&lt;span style="color: #2b91af"&gt;Category&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;General&amp;quot;&lt;/span&gt;), &lt;span style="color: #2b91af"&gt;Description&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Task name&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Name
    {
        &lt;span style="color: blue"&gt;get
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;return &lt;/span&gt;name;
        }
        &lt;span style="color: blue"&gt;set
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;string &lt;/span&gt;v = &lt;span style="color: blue"&gt;value&lt;/span&gt;.Trim();
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(v))
            {
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ApplicationException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Task name cannot be empty&amp;quot;&lt;/span&gt;);
            }
            name = v;
        }
    }

    [&lt;span style="color: #2b91af"&gt;Category&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;General&amp;quot;&lt;/span&gt;), &lt;span style="color: #2b91af"&gt;Description&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Task description&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Description
    {
        &lt;span style="color: blue"&gt;get
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;return &lt;/span&gt;description;
        }
        &lt;span style="color: blue"&gt;set
        &lt;/span&gt;{
            description = &lt;span style="color: blue"&gt;value&lt;/span&gt;.Trim();
        }
    }

    [&lt;span style="color: #2b91af"&gt;Category&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;General&amp;quot;&lt;/span&gt;), &lt;span style="color: #2b91af"&gt;Description&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Text to display&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;DisplayText
    {
        &lt;span style="color: blue"&gt;get
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;return &lt;/span&gt;displayText;
        }
        &lt;span style="color: blue"&gt;set
        &lt;/span&gt;{
            displayText = &lt;span style="color: blue"&gt;value&lt;/span&gt;;
        }
    }

    &lt;span style="color: blue"&gt;#endregion
&lt;/span&gt;}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;As you can see, we have the single property for the task (DisplayText), and two of the common Task properties – Name, and Description.&lt;/p&gt;

&lt;p&gt;Create a member variable for this node class:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GeneralViewNode &lt;/span&gt;generalNode;
&lt;span style="color: blue"&gt;internal &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GeneralViewNode &lt;/span&gt;GeneralNode
{
    &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;generalNode; }
}&lt;/pre&gt;

&lt;p&gt;Implement the IDTSTaskUIView interface. These methods are called when the UI is opened, and when the UI clicks OK.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;#region &lt;/span&gt;IDTSTaskUIView Members

&lt;span style="color: blue"&gt;public void &lt;/span&gt;OnCommit(&lt;span style="color: blue"&gt;object &lt;/span&gt;taskHost)
{
    &lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;host = taskHost &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost&lt;/span&gt;;
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(host == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Arugment is not a TaskHost.&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;taskHost&amp;quot;&lt;/span&gt;);

    HelloWorldTask.&lt;span style="color: #2b91af"&gt;HelloWorldTask &lt;/span&gt;task = host.InnerObject &lt;span style="color: blue"&gt;as &lt;/span&gt;HelloWorldTask.&lt;span style="color: #2b91af"&gt;HelloWorldTask&lt;/span&gt;;
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(task == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
    {
        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Arugment is not a HelloWorldTask.&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;taskHost&amp;quot;&lt;/span&gt;);
    }

    host.Name = generalNode.Name;
    host.Description = generalNode.Description;

    &lt;span style="color: green"&gt;// Task properties
    &lt;/span&gt;task.DisplayText = generalNode.DisplayText;
}

&lt;span style="color: blue"&gt;public void &lt;/span&gt;OnInitialize(&lt;span style="color: #2b91af"&gt;IDTSTaskUIHost &lt;/span&gt;treeHost, &lt;span style="color: #2b91af"&gt;TreeNode &lt;/span&gt;viewNode, &lt;span style="color: blue"&gt;object &lt;/span&gt;taskHost, &lt;span style="color: blue"&gt;object &lt;/span&gt;connections)
{
    &lt;span style="color: blue"&gt;this&lt;/span&gt;.generalNode = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GeneralViewNode&lt;/span&gt;(taskHost &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost&lt;/span&gt;, connections &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDtsConnectionService&lt;/span&gt;);
    &lt;span style="color: blue"&gt;this&lt;/span&gt;.propertyGrid.SelectedObject = generalNode;
}

&lt;span style="color: blue"&gt;public void &lt;/span&gt;OnLoseSelection(&lt;span style="color: blue"&gt;ref bool &lt;/span&gt;bCanLeaveView, &lt;span style="color: blue"&gt;ref string &lt;/span&gt;reason)
{
}

&lt;span style="color: blue"&gt;public void &lt;/span&gt;OnSelection()
{
}

&lt;span style="color: blue"&gt;public void &lt;/span&gt;OnValidate(&lt;span style="color: blue"&gt;ref bool &lt;/span&gt;bViewIsValid, &lt;span style="color: blue"&gt;ref string &lt;/span&gt;reason)
{
}

&lt;span style="color: blue"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Add new Windows Form – HelloWorldTaskMainWnd.cs. Change the inheritance from Form to DTSBaseTaskUI. &lt;/p&gt;

&lt;p&gt;Note, after inheriting from DTSBaseTaskUI, you’ll get an error when trying to open the code in Design view in Visual Studio 2008. This is caused by DTSBaseTaskUI not having a default constructor. We’re aware of the issue, and will hopefully be able to resolve it in a cumulative update. It won’t cause issues at runtime.&lt;/p&gt;

&lt;p&gt;Add some members for the UI properties we’ll use to initialize DTSBaseTaskUI. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private const string &lt;/span&gt;Title = &lt;span style="color: #a31515"&gt;&amp;quot;Hello World Task&amp;quot;&lt;/span&gt;;
&lt;span style="color: blue"&gt;private const string &lt;/span&gt;Description = &lt;span style="color: #a31515"&gt;&amp;quot;Displays a message box&amp;quot;&lt;/span&gt;;
&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Icon &lt;/span&gt;TaskIcon = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Icon&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HelloWorldTask&lt;/span&gt;), &lt;span style="color: #a31515"&gt;&amp;quot;Task.ico&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Add a member for GeneralView class.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GeneralView &lt;/span&gt;generalView;
&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GeneralView &lt;/span&gt;GeneralView
{
    &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;generalView; }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Add a constructor.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;HelloWorldTaskUIMainWnd(&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost, &lt;span style="color: blue"&gt;object &lt;/span&gt;connections) :
    &lt;span style="color: blue"&gt;base&lt;/span&gt;(Title, TaskIcon, Description, taskHost, connections)
{
    InitializeComponent();
    
    &lt;span style="color: green"&gt;// Setup our views
    &lt;/span&gt;generalView = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GeneralView&lt;/span&gt;();
    &lt;span style="color: blue"&gt;this&lt;/span&gt;.DTSTaskUIHost.FastLoad = &lt;span style="color: blue"&gt;false&lt;/span&gt;;
    &lt;span style="color: blue"&gt;this&lt;/span&gt;.DTSTaskUIHost.AddView(&lt;span style="color: #a31515"&gt;&amp;quot;General&amp;quot;&lt;/span&gt;, generalView, &lt;span style="color: blue"&gt;null&lt;/span&gt;);
    &lt;span style="color: blue"&gt;this&lt;/span&gt;.DTSTaskUIHost.FastLoad = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Note, the first parameter you use for AddView() is the text that gets displayed on the left of the main window.&lt;/p&gt;

&lt;p&gt;Finally, add a new class that implements IDtsTaskUI to control the launching of your new window.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HelloWorldTaskUI &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IDtsTaskUI
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDtsConnectionService &lt;/span&gt;connectionService = &lt;span style="color: blue"&gt;null&lt;/span&gt;;

    &lt;span style="color: blue"&gt;#region &lt;/span&gt;IDtsTaskUI Members

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Delete(&lt;span style="color: #2b91af"&gt;IWin32Window &lt;/span&gt;parentWindow)
    {
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ContainerControl &lt;/span&gt;GetView()
    {
        &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HelloWorldTaskUIMainWnd&lt;/span&gt;(taskHost, connectionService);
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Initialize(&lt;span style="color: #2b91af"&gt;TaskHost &lt;/span&gt;taskHost, &lt;span style="color: #2b91af"&gt;IServiceProvider &lt;/span&gt;serviceProvider)
    {
        &lt;span style="color: blue"&gt;this&lt;/span&gt;.taskHost = taskHost;
        &lt;span style="color: blue"&gt;this&lt;/span&gt;.connectionService = serviceProvider.GetService(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IDtsConnectionService&lt;/span&gt;)) &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDtsConnectionService&lt;/span&gt;;
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;New(&lt;span style="color: #2b91af"&gt;IWin32Window &lt;/span&gt;parentWindow)
    {
    }

    &lt;span style="color: blue"&gt;#endregion
&lt;/span&gt;}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;And there you go! Be sure to add the task UI assembly to the GAC before trying it out in Visual Studio. &lt;/p&gt;

&lt;p&gt;I should mention that &lt;a href="http://www.amazon.com/gp/product/0672327813/ref=sr_11_1/104-2063177-2650333?redirect=true&amp;amp;%5Fencoding=UTF8"&gt;Kirk’s book&lt;/a&gt; has a chapter on creating custom tasks that gives a lot more details than I have here. If you’re interested in extending the SSIS platform, Kirk’s book (or the “SSIS White Book” as I like to call it) is an invaluable resource.&lt;/p&gt;

&lt;p&gt;I’ve uploaded the source for the highly useful Hello World Task (and its UI) to my Sky Drive public folder. I developed this using SQL Server 2008, but it should also work the same way in 2005.&lt;/p&gt;

&lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-2aeb3aa8bb4bd9fd.skydrive.live.com/embedrowdetail.aspx/Public/HelloWorldTask.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;

&lt;p&gt;I’ll also be turning this into a community sample to be published on &lt;a href="http://www.codeplex.com/"&gt;Codeplex&lt;/a&gt; (along with our other new development samples) sometime soon.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8752636" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/Extensions/default.aspx">Extensions</category></item><item><title>MDDE appears on Codeplex</title><link>http://blogs.msdn.com/mattm/archive/2008/03/21/mdde-appears-on-codeplex.aspx</link><pubDate>Sat, 22 Mar 2008 08:38:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8330668</guid><dc:creator>mmasson</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mattm/comments/8330668.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=8330668</wfw:commentRss><description>&lt;p&gt;The SQL Server Metadata-Driven ETL Studio (MDDE) was an internal MSIT project first shown at the MS BI Conference last year. The &lt;a href="http://www.codeplex.com/SQLServerMDDEStudio"&gt;initial release is now up on Codeplex&lt;/a&gt;. There isn't much information up about it yet, but I'm told that docs and examples should be appearing soon.&lt;/p&gt;  &lt;p&gt;Essentially what MDDE gives you is a way to create SSIS package templates, which can be easily updated when your metadata changes. I'm currently playing around the code, and will hopefully have a walk-through up in the next little while.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8330668" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/MDDE/default.aspx">MDDE</category><category domain="http://blogs.msdn.com/mattm/archive/tags/Templates/default.aspx">Templates</category></item><item><title>Real world scenarios</title><link>http://blogs.msdn.com/mattm/archive/2007/06/01/real-world-scenarios.aspx</link><pubDate>Fri, 01 Jun 2007 20:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3027689</guid><dc:creator>mmasson</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mattm/comments/3027689.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=3027689</wfw:commentRss><description>&lt;P&gt;May has been a busy month!&lt;/P&gt;
&lt;P&gt;The first Microsoft Business Intelligence conference was earlier in the month, and it seemed to be a big success. I was amazed at how many people were there, and I met a lot of interesting people when I was manning the demo booth and Ask The Experts table we had setup in one of the pavilions. I got to see some interesting talks, and&amp;nbsp;previews&amp;nbsp;of the new BI offerings&amp;nbsp;MS has in the works (&lt;A href="http://office.microsoft.com/en-us/performancepoint/FX101680481033.aspx" mce_href="http://office.microsoft.com/en-us/performancepoint/FX101680481033.aspx"&gt;PerformancePoint Server 2007&lt;/A&gt; looks very slick).&lt;/P&gt;
&lt;P&gt;The SSIS team has been really busy working on Katmai, and we're now approaching our first public CTP. Typically before each release we hold an internal "Bug Bash", where the whole team spends the day running through user scenarios trying to find any last minute issues. This time we decided to do something a bit more involved...&lt;/P&gt;
&lt;P&gt;The group was split up into various teams, and each team was given a real world scenario that we had to solve using SSIS. The idea was to give the product&amp;nbsp;a workout, as well as give us a better point of view on some of the customer pain points. We were given a limited amount of time, so most solutions probably won't have full error handling, logging or other fail safe mechanisms, such as transactions and checkpoints. We hope to publish the scenarios and packages to Codeplex however,&amp;nbsp;and continue adding to them until they can be used as "Best Practice" type examples for common problems. &lt;/P&gt;
&lt;P&gt;Over the next little while I'll post some of the projects and go over the thought process behind the solutions. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3027689" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category></item><item><title>Roll your own Transfer SQL Server Objects task</title><link>http://blogs.msdn.com/mattm/archive/2007/04/18/roll-your-own-transfer-sql-server-objects-task.aspx</link><pubDate>Thu, 19 Apr 2007 02:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2182143</guid><dc:creator>mmasson</dc:creator><slash:comments>12</slash:comments><comments>http://blogs.msdn.com/mattm/comments/2182143.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=2182143</wfw:commentRss><description>&lt;P&gt;Awhile back we went through a lot of customer feedback logged through the Connect site concerning the Transfer SQL Server Objects task. Some of these turned out to be bugs, but a lot of the reported issues stemmed from usability problems with the task itself. There's actually not that much to the task on the SSIS end – it uses the &lt;A href="http://msdn2.microsoft.com/en-us/library/ms162557.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms162557.aspx"&gt;SQL Server Management Objects&lt;/A&gt; (SMO) API to do the bulk of the work. Anyone familiar with the SMO &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.transfer.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.transfer.aspx"&gt;Transfer&lt;/A&gt; object will notice the similarities in the task's UI. We end up exposing the majority of the Transfer object's members as properties, which leads to most of the reported problems with the task; it's complicated, and options sometimes conflict with each other. &lt;/P&gt;
&lt;P&gt;It's always a challenge to get the right balance of usability and functionality, and we're hoping to address the problems with this task in a future release (suggestions are always welcome). In the mean time, you can always "roll your own" version of task using the SMO API directly through a script task. &lt;/P&gt;
&lt;P&gt;First you'll need to add references to the three SMO&amp;nbsp;assemblies (found under Microsoft SQL Server\90\SDK\Assemblies): &lt;/P&gt;
&lt;P&gt;Microsoft.SqlServer.ConnectionInfo &lt;BR&gt;Microsoft.SqlServer.Smo&lt;BR&gt;Microsoft.SqlServer.SmoEnum&lt;/P&gt;
&lt;P&gt;Import the SMO namespaces in your code: &lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&lt;SPAN style="COLOR: blue"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Imports&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;FONT color=#000000&gt; Microsoft.SqlServer.Management.Smo&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Imports&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;FONT color=#000000&gt; Microsoft.SqlServer.Management.Common&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;P&gt;The following code was adapted from one of the samples on MSDN. It creates a new database on your local server, and sets up a Transfer object to copy across all tables, dependencies, and data from the AdventureWorks database. &lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;Sub&lt;/SPAN&gt; Main()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Dim&lt;/SPAN&gt; dbSourceName &lt;SPAN style="COLOR: blue"&gt;As&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;String&lt;/SPAN&gt; = &lt;SPAN style="COLOR: #a31515"&gt;"AdventureWorks"&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Dim&lt;/SPAN&gt; dbDestName &lt;SPAN style="COLOR: blue"&gt;As&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;String&lt;/SPAN&gt; = dbSourceName + &lt;SPAN style="COLOR: #a31515"&gt;"Copy"&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;'Connect to the local, default instance of SQL Server.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Dim&lt;/SPAN&gt; srv &lt;SPAN style="COLOR: blue"&gt;As&lt;/SPAN&gt; Server&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;srv = &lt;SPAN style="COLOR: blue"&gt;New&lt;/SPAN&gt; Server&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;'Reference the source database&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Dim&lt;/SPAN&gt; db &lt;SPAN style="COLOR: blue"&gt;As&lt;/SPAN&gt; Database&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;db = srv.Databases(dbSourceName)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;'Create a new database that is to be destination database.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Dim&lt;/SPAN&gt; dbCopy &lt;SPAN style="COLOR: blue"&gt;As&lt;/SPAN&gt; Database&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;dbCopy = &lt;SPAN style="COLOR: blue"&gt;New&lt;/SPAN&gt; Database(srv, dbDestName)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;dbCopy.Create()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;'Define a Transfer object and set the required options.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Dim&lt;/SPAN&gt; xfr &lt;SPAN style="COLOR: blue"&gt;As&lt;/SPAN&gt; Transfer&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr = &lt;SPAN style="COLOR: blue"&gt;New&lt;/SPAN&gt; Transfer(db)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.CopyAllTables = &lt;SPAN style="COLOR: blue"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.Options.WithDependencies = &lt;SPAN style="COLOR: blue"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.Options.ContinueScriptingOnError = &lt;SPAN style="COLOR: blue"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.DestinationDatabase = dbCopy.Name&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.DestinationServer = srv.Name&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.DestinationLoginSecure = &lt;SPAN style="COLOR: blue"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.CopySchema = &lt;SPAN style="COLOR: blue"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;'Include data&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.CopyData = &lt;SPAN style="COLOR: blue"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;'Execute the transfer&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xfr.TransferData()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp; Dts.TaskResult = Dts.Results.Success&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;/SPAN&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;&lt;/SPAN&gt;Another useful method of the Transfer object is &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.transfer.scripttransfer.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.transfer.scripttransfer.aspx"&gt;ScriptTransfer()&lt;/A&gt; – it returns the T-SQL script of what you've configured your Transfer object to do. You can dump this to debug any issues you run into, and to figure out exactly what SMO is doing. &lt;/P&gt;
&lt;P&gt;Interestingly, SMO actually uses SSIS internally to do its data transfer. It creates a couple of temporary packages on-the-fly, and runs behind the scenes. (It's possible to capture the scripts and packages if you set break points in the right place – send me an email or leave comments if you're interested in how to do this). &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2182143" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/SMO/default.aspx">SMO</category><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/Script+Task/default.aspx">Script Task</category></item><item><title>SQL Server on Codeplex</title><link>http://blogs.msdn.com/mattm/archive/2007/03/29/sql-server-on-codeplex.aspx</link><pubDate>Fri, 30 Mar 2007 04:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1991933</guid><dc:creator>mmasson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattm/comments/1991933.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=1991933</wfw:commentRss><description>&lt;P&gt;SQL Server now has its &lt;A class="" title=Codeplex href="http://www.codeplex.com/SqlServerSamples" mce_href="http://www.codeplex.com/SqlServerSamples"&gt;own section on codeplex&lt;/A&gt; (Microsoft's open source project hosting site). This site includes all of the samples that come with SP2, in a single-serve format. Each &lt;A class="" href="http://www.codeplex.com/MSFTISProdSamples" mce_href="http://www.codeplex.com/MSFTISProdSamples"&gt;product&lt;/A&gt; has&amp;nbsp;a section, so you can grab samples for individual products instead of running the monolithic samples installer. These samples should be updated regularly, and will hopefully grow&amp;nbsp;with contributions from our MVPs. &lt;/P&gt;
&lt;P&gt;As we near our first public technical preview, you can expect to see some Katmai samples showing up as well!&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1991933" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/Samples/default.aspx">Samples</category><category domain="http://blogs.msdn.com/mattm/archive/tags/SQL+Server/default.aspx">SQL Server</category></item></channel></rss>