<?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 : API</title><link>http://blogs.msdn.com/mattm/archive/tags/API/default.aspx</link><description>Tags: API</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Looking up SSIS HResult / COMException ErrorCode</title><link>http://blogs.msdn.com/mattm/archive/2009/08/03/looking-up-ssis-hresult-comexception-errorcode.aspx</link><pubDate>Tue, 04 Aug 2009 07:21:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9856793</guid><dc:creator>mmasson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9856793.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9856793</wfw:commentRss><description>&lt;p&gt;The method I describe in &lt;a href="http://blogs.msdn.com/mattm/archive/2009/08/03/debugging-a-comexception-during-package-generation.aspx"&gt;my post about handling COMExceptions during package generation&lt;/a&gt; works if you have control over the package generation code, but sometimes you’ll be using third party libraries, or debugging after the fact. &lt;/p&gt;  &lt;p&gt;Note, the error codes, symbolic names, and descriptions for all of the SSIS HResults can all be found on the &lt;a href="http://msdn.microsoft.com/en-us/library/ms345164.aspx"&gt;Integration Services Error and Message Reference&lt;/a&gt; page in Books Online. This should be your first stop if you want to quickly (and manually) lookup an SSIS error code. &lt;/p&gt;  &lt;p&gt;However, if you want to do this programmatically…&lt;/p&gt;  &lt;p&gt;The symbolic name for each SSIS error is slightly more useful than the hex error code value, and will sometimes be enough for you to isolate your problem right away. You can programmatically determine the symbolic name by comparing the error code value against the members of the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.hresults_members.aspx"&gt;HResults&lt;/a&gt; class.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static string &lt;/span&gt;GetSymbolicName(&lt;span style="color: blue"&gt;int &lt;/span&gt;errorCode)
{
    &lt;span style="color: blue"&gt;string &lt;/span&gt;symbolicName = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty;
    &lt;span style="color: #2b91af"&gt;HResults &lt;/span&gt;hresults = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HResults&lt;/span&gt;();

    &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;FieldInfo &lt;/span&gt;fieldInfo &lt;span style="color: blue"&gt;in &lt;/span&gt;hresults.GetType().GetFields())
    {
        &lt;span style="color: blue"&gt;if &lt;/span&gt;((&lt;span style="color: blue"&gt;int&lt;/span&gt;)fieldInfo.GetValue(hresults) == errorCode)
        {
            symbolicName = fieldInfo.Name;
            &lt;span style="color: blue"&gt;break&lt;/span&gt;;
        }
    }

    &lt;span style="color: blue"&gt;return &lt;/span&gt;symbolicName;
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;I could use this function in a try/catch block to give the user additional information as to why the error occurred.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;COMException &lt;/span&gt;ex)
{
    &lt;span style="color: blue"&gt;string &lt;/span&gt;symbolicName = GetSymbolicName(ex.ErrorCode);
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Symbolic Name: {0}&amp;quot;&lt;/span&gt;, symbolicName);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Retrieving the actual error message for a given SSIS HResult is a little more involved. We can use the &lt;a href="http://msdn.microsoft.com/en-us/library/ms679351(VS.85).aspx"&gt;FormatMessage&lt;/a&gt; API to pull the message directly out of the dtsmsg100.dll (in 2005, it’s dtsmsg.dll). To do this, we’ll need to expose a couple of native methods so we can pinvoke them.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NativeMethods
&lt;/span&gt;{
    [&lt;span style="color: #2b91af"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: blue"&gt;public static extern &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;LoadLibrary(&lt;span style="color: blue"&gt;string &lt;/span&gt;dllToLoad);

    [&lt;span style="color: #2b91af"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: blue"&gt;public static extern bool &lt;/span&gt;FreeLibrary(&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;hModule);

    [&lt;span style="color: #2b91af"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Kernel32.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: blue"&gt;true&lt;/span&gt;)]
    &lt;span style="color: blue"&gt;public static extern uint &lt;/span&gt;FormatMessage(&lt;span style="color: blue"&gt;uint &lt;/span&gt;dwFlags, &lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;lpSource,
       &lt;span style="color: blue"&gt;uint &lt;/span&gt;dwMessageId, &lt;span style="color: blue"&gt;uint &lt;/span&gt;dwLanguageId, &lt;span style="color: blue"&gt;ref &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;lpBuffer,
       &lt;span style="color: blue"&gt;uint &lt;/span&gt;nSize, &lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;pArguments);

    &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_ALLOCATE_BUFFER = 256;
    &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_IGNORE_INSERTS = 512;
    &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_FROM_STRING = 1024;
    &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_FROM_HMODULE = 2048;
    &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_FROM_SYSTEM = 4096;
    &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192;
    &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_MAX_WIDTH_MASK = 255;
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;First we’ll get a handle to dtsmsg100.dll using &lt;a href="http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx"&gt;LoadLibrary&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;handle = &lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.LoadLibrary(&lt;span style="color: #a31515"&gt;&amp;quot;dtsmsg100.dll&amp;quot;&lt;/span&gt;);
&lt;span style="color: blue"&gt;if &lt;/span&gt;(handle == &lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero)
{
    &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Exception&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Couldn't open library dtsmsg100.dll&amp;quot;&lt;/span&gt;);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Then we’ll call &lt;a href="http://msdn.microsoft.com/en-us/library/ms679351(VS.85).aspx"&gt;FormatMessage&lt;/a&gt;. The first parameter is a set of flags – we’ll want the native method to do the allocation, the messages to be loaded from a specific DLL (dtsmsg), and we don’t want to do any parameter substitution.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;const int &lt;/span&gt;FormatMessageFlags = &lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FORMAT_MESSAGE_ALLOCATE_BUFFER | &lt;span style="color: green"&gt;// FormatMessage will allocate buffer
                               &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FORMAT_MESSAGE_FROM_HMODULE |    &lt;span style="color: green"&gt;// Messages are loaded from specified DLL
                               &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FORMAT_MESSAGE_IGNORE_INSERTS;   &lt;span style="color: green"&gt;// Don't perform place holder substitutions&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;lpMsgBuf = &lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero;
&lt;span style="color: blue"&gt;uint &lt;/span&gt;dwChars = &lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FormatMessage(
                    FormatMessageFlags,
                    handle,                 &lt;span style="color: green"&gt;// handle to error message dll
                    &lt;/span&gt;errorCode,              &lt;span style="color: green"&gt;// error code we're looking up
                    &lt;/span&gt;0,                      &lt;span style="color: green"&gt;// 0 for default language
                    &lt;/span&gt;&lt;span style="color: blue"&gt;ref &lt;/span&gt;lpMsgBuf,           &lt;span style="color: green"&gt;// message buffer
                    &lt;/span&gt;2048,                   &lt;span style="color: green"&gt;// max size of message buffer
                    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero);           &lt;span style="color: green"&gt;// substitution arguments

&lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(dwChars == 0)
{
    &lt;span style="color: green"&gt;// FormatMessage will set LastError
    &lt;/span&gt;&lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Win32Exception&lt;/span&gt;();
}

&lt;span style="color: blue"&gt;string &lt;/span&gt;sMessage = &lt;span style="color: #2b91af"&gt;Marshal&lt;/span&gt;.PtrToStringAnsi(lpMsgBuf);

&lt;span style="color: green"&gt;// Free the buffer
&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Marshal&lt;/span&gt;.FreeHGlobal(lpMsgBuf);&lt;/pre&gt;

&lt;p&gt;Once we have the error message, we can release the handle to dtsmsg using &lt;a href="http://msdn.microsoft.com/en-us/library/ms683152(VS.85).aspx"&gt;FreeLibrary&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Using the same scenario from my &lt;a href="http://blogs.msdn.com/mattm/archive/2009/08/03/debugging-a-comexception-during-package-generation.aspx"&gt;previous post&lt;/a&gt;, getting a COMException off a call to AcquireConnection() gives me an HResult of 0xC020801C. Programmatically retrieving the error message gives me this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER.&amp;#160; The AcquireConnection method call to the connection manager &amp;quot;&lt;strong&gt;%1&lt;/strong&gt;&amp;quot; failed with error code 0x&lt;strong&gt;%2!8.8X!&lt;/strong&gt;.&amp;#160; There may be error messages posted before this with more information on why the AcquireConnection method call failed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice the format placeholders (%1 and %2!8.8X!) weren’t filled in. This is because we used the FORMAT_MESSAGE_IGNORE_INSERTS flag on FormatMessage – we wouldn’t have known what values to put in there, since we weren’t the ones that raised the original exception.&lt;/p&gt;

&lt;p&gt;I’ve encapsulated all of this logic in the HResultsHelper class. I’ve included the full code listing (including a CreatePackage method from previous API posts) here.&lt;/p&gt;

&lt;p&gt;-------&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.SqlServer.Dts.Runtime;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.SqlServer.Dts.Pipeline.Wrapper;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Runtime.InteropServices;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.ComponentModel;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Globalization;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Reflection;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;ErrorMsgFromHResult
{
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HResultHelper &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IDisposable
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;const string &lt;/span&gt;MessageDLL = &lt;span style="color: #a31515"&gt;@&amp;quot;dtsmsg100.dll&amp;quot;&lt;/span&gt;;

        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;handle = &lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero;
        &lt;span style="color: blue"&gt;bool &lt;/span&gt;disposed;
        &lt;span style="color: blue"&gt;const int &lt;/span&gt;FormatMessageFlags = &lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FORMAT_MESSAGE_ALLOCATE_BUFFER | &lt;span style="color: green"&gt;// FormatMessage will allocate buffer
                                       &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FORMAT_MESSAGE_FROM_HMODULE |    &lt;span style="color: green"&gt;// Messages are loaded from specified DLL
                                       &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FORMAT_MESSAGE_IGNORE_INSERTS;   &lt;span style="color: green"&gt;// Don't perform place holder substitutions

        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;HResultHelper()
        {
            &lt;span style="color: green"&gt;// Load the DLL we'll get the error messages from
            &lt;/span&gt;handle = &lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.LoadLibrary(MessageDLL);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(handle == &lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero)
            {
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Exception&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #2b91af"&gt;CultureInfo&lt;/span&gt;.CurrentCulture, &lt;span style="color: #a31515"&gt;&amp;quot;Couldn't open library: {0}&amp;quot;&lt;/span&gt;, MessageDLL));
            }
        }

        &lt;span style="color: blue"&gt;public string &lt;/span&gt;GetErrorMessage(&lt;span style="color: #2b91af"&gt;COMException &lt;/span&gt;comException)
        {
            &lt;span style="color: blue"&gt;return &lt;/span&gt;GetErrorMessage((&lt;span style="color: blue"&gt;uint&lt;/span&gt;)comException.ErrorCode);
        }

        &lt;span style="color: blue"&gt;public string &lt;/span&gt;GetErrorMessage(&lt;span style="color: blue"&gt;uint &lt;/span&gt;errorCode)
        {
            &lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;lpMsgBuf = &lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero;
            &lt;span style="color: blue"&gt;uint &lt;/span&gt;dwChars = &lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FormatMessage(
                                FormatMessageFlags,
                                handle,                 &lt;span style="color: green"&gt;// handle to error message dll
                                &lt;/span&gt;errorCode,              &lt;span style="color: green"&gt;// error code we're looking up
                                &lt;/span&gt;0,                      &lt;span style="color: green"&gt;// 0 for default language
                                &lt;/span&gt;&lt;span style="color: blue"&gt;ref &lt;/span&gt;lpMsgBuf,           &lt;span style="color: green"&gt;// message buffer
                                &lt;/span&gt;2048,                   &lt;span style="color: green"&gt;// max size of message buffer
                                &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero);           &lt;span style="color: green"&gt;// substitution arguments

            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(dwChars == 0)
            {
                &lt;span style="color: green"&gt;// FormatMessage will set LastError
                &lt;/span&gt;&lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Win32Exception&lt;/span&gt;();
            }

            &lt;span style="color: blue"&gt;string &lt;/span&gt;sRet = &lt;span style="color: #2b91af"&gt;Marshal&lt;/span&gt;.PtrToStringAnsi(lpMsgBuf);

            &lt;span style="color: green"&gt;// Free the buffer
            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Marshal&lt;/span&gt;.FreeHGlobal(lpMsgBuf);

            &lt;span style="color: blue"&gt;return &lt;/span&gt;sRet;
        }

        &lt;span style="color: blue"&gt;public void &lt;/span&gt;Dispose()
        {
            Dispose(&lt;span style="color: blue"&gt;true&lt;/span&gt;);
            &lt;span style="color: #2b91af"&gt;GC&lt;/span&gt;.SuppressFinalize(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
        }

        &lt;span style="color: blue"&gt;private void &lt;/span&gt;Dispose(&lt;span style="color: blue"&gt;bool &lt;/span&gt;disposing)
        {
            &lt;span style="color: blue"&gt;if&lt;/span&gt;(!&lt;span style="color: blue"&gt;this&lt;/span&gt;.disposed)
            {
                &lt;span style="color: #2b91af"&gt;NativeMethods&lt;/span&gt;.FreeLibrary(handle);
                handle = &lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero;
                disposed = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
            }
        }

        ~HResultHelper()
        {
            Dispose(&lt;span style="color: blue"&gt;false&lt;/span&gt;);
        }

        &lt;span style="color: blue"&gt;static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NativeMethods
        &lt;/span&gt;{
            [&lt;span style="color: #2b91af"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;)]
            &lt;span style="color: blue"&gt;public static extern &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;LoadLibrary(&lt;span style="color: blue"&gt;string &lt;/span&gt;dllToLoad);

            [&lt;span style="color: #2b91af"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;)]
            &lt;span style="color: blue"&gt;public static extern bool &lt;/span&gt;FreeLibrary(&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;hModule);

            [&lt;span style="color: #2b91af"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Kernel32.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: blue"&gt;true&lt;/span&gt;)]
            &lt;span style="color: blue"&gt;public static extern uint &lt;/span&gt;FormatMessage(&lt;span style="color: blue"&gt;uint &lt;/span&gt;dwFlags, &lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;lpSource,
               &lt;span style="color: blue"&gt;uint &lt;/span&gt;dwMessageId, &lt;span style="color: blue"&gt;uint &lt;/span&gt;dwLanguageId, &lt;span style="color: blue"&gt;ref &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;lpBuffer,
               &lt;span style="color: blue"&gt;uint &lt;/span&gt;nSize, &lt;span style="color: #2b91af"&gt;IntPtr &lt;/span&gt;pArguments);

            &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_ALLOCATE_BUFFER = 256;
            &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_IGNORE_INSERTS = 512;
            &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_FROM_STRING = 1024;
            &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_FROM_HMODULE = 2048;
            &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_FROM_SYSTEM = 4096;
            &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192;
            &lt;span style="color: blue"&gt;public const int &lt;/span&gt;FORMAT_MESSAGE_MAX_WIDTH_MASK = 255;
        }
    }


    &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program
    &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;HResultHelper &lt;/span&gt;helper = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HResultHelper&lt;/span&gt;();

            &lt;span style="color: blue"&gt;try
            &lt;/span&gt;{
                CreatePackage();
            }
            &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;COMException &lt;/span&gt;ex)
            {
                &lt;span style="color: blue"&gt;string &lt;/span&gt;errorMessage = helper.GetErrorMessage(ex);
                &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(errorMessage);
            }

            helper.Dispose();
        }

        &lt;span style="color: blue"&gt;static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;CreatePackage()
        {
            &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;// Set the IDTSComponentEvent handler to capture the details from any 
            // COMExceptions raised during package generation
            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentEventHandler &lt;/span&gt;events = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentEventHandler&lt;/span&gt;();
            pipeline.Events = &lt;span style="color: #2b91af"&gt;DtsConvert&lt;/span&gt;.GetExtendedInterface(events &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentEvents&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;Connect Timeout=1&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 OLEDB Destination
            //

            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentMetaData100 &lt;/span&gt;destComponent = pipeline.ComponentMetaDataCollection.New();
            destComponent.ComponentClassID = &lt;span style="color: #a31515"&gt;&amp;quot;DTSAdapter.OleDbDestination&amp;quot;&lt;/span&gt;;
            destComponent.ValidateExternalMetadata = &lt;span style="color: blue"&gt;true&lt;/span&gt;;

            &lt;span style="color: #2b91af"&gt;IDTSDesigntimeComponent100 &lt;/span&gt;destDesignTimeComponent = destComponent.Instantiate();
            destDesignTimeComponent.ProvideComponentProperties();
            destComponent.Name = &lt;span style="color: #a31515"&gt;&amp;quot;OleDb Destination&amp;quot;&lt;/span&gt;;

            destDesignTimeComponent.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;AccessMode&amp;quot;&lt;/span&gt;, 3);
            destDesignTimeComponent.SetComponentProperty(&lt;span style="color: #a31515"&gt;&amp;quot;OpenRowset&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;[DimCustomer_Copy]&amp;quot;&lt;/span&gt;);

            &lt;span style="color: green"&gt;// set connection
            &lt;/span&gt;destComponent.RuntimeConnectionCollection[0].ConnectionManager = &lt;span style="color: #2b91af"&gt;DtsConvert&lt;/span&gt;.GetExtendedInterface(connection);
            destComponent.RuntimeConnectionCollection[0].ConnectionManagerID = connection.ID;

            &lt;span style="color: green"&gt;// get metadata
            &lt;/span&gt;destDesignTimeComponent.AcquireConnections(&lt;span style="color: blue"&gt;null&lt;/span&gt;);
            destDesignTimeComponent.ReinitializeMetaData();
            destDesignTimeComponent.ReleaseConnections();

            &lt;span style="color: green"&gt;//
            // Connect source and destination
            //

            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSPath100 &lt;/span&gt;path = pipeline.PathCollection.New();
            path.AttachPathAndPropagateNotifications(srcComponent.OutputCollection[0], destComponent.InputCollection[0]);

            &lt;span style="color: green"&gt;//
            // Configure the destination
            // 

            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSInput100 &lt;/span&gt;destInput = destComponent.InputCollection[0];
            &lt;span style="color: #2b91af"&gt;IDTSVirtualInput100 &lt;/span&gt;destVirInput = destInput.GetVirtualInput();
            &lt;span style="color: #2b91af"&gt;IDTSInputColumnCollection100 &lt;/span&gt;destInputCols = destInput.InputColumnCollection;
            &lt;span style="color: #2b91af"&gt;IDTSExternalMetadataColumnCollection100 &lt;/span&gt;destExtCols = destInput.ExternalMetadataColumnCollection;
            &lt;span style="color: #2b91af"&gt;IDTSOutputColumnCollection100 &lt;/span&gt;sourceColumns = srcComponent.OutputCollection[0].OutputColumnCollection;

            &lt;span style="color: green"&gt;// The OLEDB destination requires you to hook up the external columns
            &lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IDTSOutputColumn100 &lt;/span&gt;outputCol &lt;span style="color: blue"&gt;in &lt;/span&gt;sourceColumns)
            {
                &lt;span style="color: green"&gt;// Get the external column id
                &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSExternalMetadataColumn100 &lt;/span&gt;extCol = (&lt;span style="color: #2b91af"&gt;IDTSExternalMetadataColumn100&lt;/span&gt;)destExtCols[outputCol.Name];
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(extCol != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                {
                    &lt;span style="color: green"&gt;// Create an input column from an output col of previous component.
                    &lt;/span&gt;destVirInput.SetUsageType(outputCol.ID, &lt;span style="color: #2b91af"&gt;DTSUsageType&lt;/span&gt;.UT_READONLY);
                    &lt;span style="color: #2b91af"&gt;IDTSInputColumn100 &lt;/span&gt;inputCol = destInputCols.GetInputColumnByLineageID(outputCol.ID);
                    &lt;span style="color: blue"&gt;if &lt;/span&gt;(inputCol != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                    {
                        &lt;span style="color: green"&gt;// map the input column with an external metadata column
                        &lt;/span&gt;destDesignTimeComponent.MapInputColumn(destInput.ID, inputCol.ID, extCol.ID);
                    }
                }
            }

            &lt;span style="color: blue"&gt;return &lt;/span&gt;package;
        }

        &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentEventHandler &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IDTSComponentEvents
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;private void &lt;/span&gt;HandleEvent(&lt;span style="color: blue"&gt;string &lt;/span&gt;type, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description)
            {
                &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;[{0}] {1}: {2}&amp;quot;&lt;/span&gt;, type, subComponent, description);
            }

            &lt;span style="color: blue"&gt;#region &lt;/span&gt;IDTSComponentEvents Members

            &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireBreakpointHit(&lt;span style="color: #2b91af"&gt;BreakpointTarget &lt;/span&gt;breakpointTarget)
            {
            }

            &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireCustomEvent(&lt;span style="color: blue"&gt;string &lt;/span&gt;eventName, &lt;span style="color: blue"&gt;string &lt;/span&gt;eventText, &lt;span style="color: blue"&gt;ref object&lt;/span&gt;[] arguments, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;ref bool &lt;/span&gt;fireAgain)
            {
            }

            &lt;span style="color: blue"&gt;public bool &lt;/span&gt;FireError(&lt;span style="color: blue"&gt;int &lt;/span&gt;errorCode, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description, &lt;span style="color: blue"&gt;string &lt;/span&gt;helpFile, &lt;span style="color: blue"&gt;int &lt;/span&gt;helpContext)
            {
                HandleEvent(&lt;span style="color: #a31515"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;, subComponent, description);
                &lt;span style="color: blue"&gt;return true&lt;/span&gt;;
            }

            &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireInformation(&lt;span style="color: blue"&gt;int &lt;/span&gt;informationCode, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description, &lt;span style="color: blue"&gt;string &lt;/span&gt;helpFile, &lt;span style="color: blue"&gt;int &lt;/span&gt;helpContext, &lt;span style="color: blue"&gt;ref bool &lt;/span&gt;fireAgain)
            {
                HandleEvent(&lt;span style="color: #a31515"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;, subComponent, description);
            }

            &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireProgress(&lt;span style="color: blue"&gt;string &lt;/span&gt;progressDescription, &lt;span style="color: blue"&gt;int &lt;/span&gt;percentComplete, &lt;span style="color: blue"&gt;int &lt;/span&gt;progressCountLow, &lt;span style="color: blue"&gt;int &lt;/span&gt;progressCountHigh, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;ref bool &lt;/span&gt;fireAgain)
            {
            }

            &lt;span style="color: blue"&gt;public bool &lt;/span&gt;FireQueryCancel()
            {
                &lt;span style="color: blue"&gt;return true&lt;/span&gt;;
            }

            &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireWarning(&lt;span style="color: blue"&gt;int &lt;/span&gt;warningCode, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description, &lt;span style="color: blue"&gt;string &lt;/span&gt;helpFile, &lt;span style="color: blue"&gt;int &lt;/span&gt;helpContext)
            {
                HandleEvent(&lt;span style="color: #a31515"&gt;&amp;quot;Warning&amp;quot;&lt;/span&gt;, subComponent, description);
            }

            &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;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9856793" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>Debugging a COMException during package generation</title><link>http://blogs.msdn.com/mattm/archive/2009/08/03/debugging-a-comexception-during-package-generation.aspx</link><pubDate>Tue, 04 Aug 2009 06:27:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9856748</guid><dc:creator>mmasson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9856748.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9856748</wfw:commentRss><description>&lt;p&gt;You’ll occasionally receive a &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comexception.aspx"&gt;COMException&lt;/a&gt; when you’re programmatically generating SSIS package – typically when dealing with Data Flow components. These COM Exceptions will provide you with an HRESULT (ErrorCode), and no additional information. &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;System.Runtime.InteropServices.COMException (0xC020801C): Exception from HRESULT: 0xC020801C      &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Dts.Pipeline.Wrapper.CManagedComponentWrapperClass.AcquireConnections(Object pTransaction)       &lt;br /&gt;&amp;#160;&amp;#160; at MyApp.Program.CreatePackage()       &lt;br /&gt;&amp;#160;&amp;#160; at MyApp.Program.Main(String[] args)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ideally the exception you receive would have the underlying error message included. Unfortunately, the SSIS pipeline API doesn’t provide the &lt;a href="http://msdn.microsoft.com/en-us/library/ms345164.aspx"&gt;IErrorInfo&lt;/a&gt; support needed for the .NET runtime to determine the error details, but there is a way for you to receive the error(s) using an event handler.&lt;/p&gt;  &lt;p&gt;For this to work, you’ll need to be able to modify the package generation code (or at least control the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.taskhost.aspx"&gt;TaskHost&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.pipeline.wrapper.mainpipe.aspx"&gt;MainPipe&lt;/a&gt; of the data flow objects). You’ll receive detailed error messages by supplying an &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.idtscomponentevents.aspx"&gt;IDTSComponentEvents&lt;/a&gt; handler for the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.pipeline.wrapper.idtspipeline100.events.aspx"&gt;IDTSPipeline100.Events&lt;/a&gt; property. The &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.idtscomponentevents.fireerror.aspx"&gt;FireError&lt;/a&gt; event will be raised right before any COMException is thrown, proving you the error details.&lt;/p&gt;  &lt;p&gt;The first step is to create a class which implements the IDTSComponentEvents interface. This class is simply going to report all errors and warnings out to the console as they occur. &lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentEventHandler &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IDTSComponentEvents
&lt;/span&gt;{&lt;/pre&gt;

&lt;pre class="code"&gt;    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;FireError(&lt;span style="color: blue"&gt;int &lt;/span&gt;errorCode, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description, &lt;span style="color: blue"&gt;string &lt;/span&gt;helpFile, &lt;span style="color: blue"&gt;int &lt;/span&gt;helpContext)
    {
        Console.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;[Error] {0}: {2}&amp;quot;&lt;/span&gt;, subComponent, description);
        &lt;span style="color: blue"&gt;return true&lt;/span&gt;;
    }&lt;/pre&gt;

&lt;pre class="code"&gt;[…]
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Next, we’ll hook up an instance of this class to the Events property of our MainPipe (Data Flow) object. &lt;/p&gt;

&lt;pre class="code"&gt;&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;// Set the IDTSComponentEvent handler to capture the details from any 
// COMExceptions raised during package generation
&lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentEventHandler &lt;/span&gt;events = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentEventHandler&lt;/span&gt;();
pipeline.Events = &lt;span style="color: #2b91af"&gt;DtsConvert&lt;/span&gt;.GetExtendedInterface(events &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDTSComponentEvents&lt;/span&gt;);&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;After this, any COMExceptions raised by the pipeline will be displayed on the console.&lt;/p&gt;

&lt;p&gt;For example, let’s look at the COM Exception I listed at the top of this post (HRESULT 0xC020801C). Looking up the error code on the &lt;a href="http://msdn.microsoft.com/en-us/library/ms345164.aspx"&gt;Integration Services Error and Message Reference&lt;/a&gt; page tells me that the HRESULT maps to DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER, so there’s a good chance one of my calls to AcquireConnection() is causing the exception. If my package contained a number of data sources and connection managers, it could make it very difficult to debug.&lt;/p&gt;

&lt;p&gt;After hooking up the event handler, I see the following on the command line before receiving the exception:&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New"&gt;[Error] OleDb Source [1]: SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER.&amp;#160; The AcquireConnection method call to the connection manager &amp;quot;localhost&amp;quot; failed with error code 0xC0202009.&amp;#160; There may be error messages posted before this with more information on why the AcquireConnection method call failed.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;Now I know which source is failing (OleDb Source [1]), and which connection manager (localhost) is causing the problem. It could still be better, but now at least I know where to start debugging (ie. make sure that the database on localhost is up and running).&lt;/p&gt;

&lt;p&gt;Here is a full implementation of IDTSComponentEvents incase you want to try it out yourself.&lt;/p&gt;

&lt;p&gt;--------&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComponentEventHandler &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IDTSComponentEvents
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;private void &lt;/span&gt;HandleEvent(&lt;span style="color: blue"&gt;string &lt;/span&gt;type, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description)
    {
        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;[{0}] {1}: {2}&amp;quot;&lt;/span&gt;, type, subComponent, description);
    }

    &lt;span style="color: blue"&gt;#region &lt;/span&gt;IDTSComponentEvents Members

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireBreakpointHit(&lt;span style="color: #2b91af"&gt;BreakpointTarget &lt;/span&gt;breakpointTarget)
    {
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireCustomEvent(&lt;span style="color: blue"&gt;string &lt;/span&gt;eventName, &lt;span style="color: blue"&gt;string &lt;/span&gt;eventText, &lt;span style="color: blue"&gt;ref object&lt;/span&gt;[] arguments, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;ref bool &lt;/span&gt;fireAgain)
    {
    }

    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;FireError(&lt;span style="color: blue"&gt;int &lt;/span&gt;errorCode, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description, &lt;span style="color: blue"&gt;string &lt;/span&gt;helpFile, &lt;span style="color: blue"&gt;int &lt;/span&gt;helpContext)
    {
        HandleEvent(&lt;span style="color: #a31515"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;, subComponent, description);
        &lt;span style="color: blue"&gt;return true&lt;/span&gt;;
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireInformation(&lt;span style="color: blue"&gt;int &lt;/span&gt;informationCode, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description, &lt;span style="color: blue"&gt;string &lt;/span&gt;helpFile, &lt;span style="color: blue"&gt;int &lt;/span&gt;helpContext, &lt;span style="color: blue"&gt;ref bool &lt;/span&gt;fireAgain)
    {
        HandleEvent(&lt;span style="color: #a31515"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;, subComponent, description);
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireProgress(&lt;span style="color: blue"&gt;string &lt;/span&gt;progressDescription, &lt;span style="color: blue"&gt;int &lt;/span&gt;percentComplete, &lt;span style="color: blue"&gt;int &lt;/span&gt;progressCountLow, &lt;span style="color: blue"&gt;int &lt;/span&gt;progressCountHigh, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;ref bool &lt;/span&gt;fireAgain)
    {
    }

    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;FireQueryCancel()
    {
        &lt;span style="color: blue"&gt;return true&lt;/span&gt;;
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;FireWarning(&lt;span style="color: blue"&gt;int &lt;/span&gt;warningCode, &lt;span style="color: blue"&gt;string &lt;/span&gt;subComponent, &lt;span style="color: blue"&gt;string &lt;/span&gt;description, &lt;span style="color: blue"&gt;string &lt;/span&gt;helpFile, &lt;span style="color: blue"&gt;int &lt;/span&gt;helpContext)
    {
        HandleEvent(&lt;span style="color: #a31515"&gt;&amp;quot;Warning&amp;quot;&lt;/span&gt;, subComponent, description);    
    }

    &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;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9856748" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>API Sample – Programmatically create and export configuration files for your packages</title><link>http://blogs.msdn.com/mattm/archive/2009/03/02/api-sample-programmatically-create-and-export-configuration-files-for-your-packages.aspx</link><pubDate>Tue, 03 Mar 2009 02:14:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9455404</guid><dc:creator>mmasson</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9455404.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9455404</wfw:commentRss><description>&lt;p&gt;The &lt;a href="http://blogs.msdn.com/mattm/archive/2009/03/02/api-sample-programmatically-add-a-configuration-file-to-a-package.aspx"&gt;previous sample&lt;/a&gt; shows how to add a reference to an existing configuration file. This sample shows how to create a new configuration file for a package.&lt;/p&gt;  &lt;p&gt;Things to note:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The first step is to flag the property you want to export by calling DtsProperty.SetExport(). The first argument is a reference to the object the property belongs to. &lt;/li&gt;    &lt;li&gt;The CreatePackage() method just creates a package (it doesn’t matter what is in it). Typically you’d be using this code to add a configuration to an existing package (doing a Package.LoadFromXml() or something similar)&lt;/li&gt; &lt;/ul&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConfigurationExport
&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;//
        // Export a configuration for all connection managers in a package
        //
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;package = CreatePackage();

        &lt;span style="color: green"&gt;// Enable configurations
        &lt;/span&gt;package.EnableConfigurations = &lt;span style="color: blue"&gt;true&lt;/span&gt;;

        &lt;span style="color: green"&gt;// Flag all connection manager connection strings as exportable
        &lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;cm &lt;span style="color: blue"&gt;in &lt;/span&gt;package.Connections)
        {
            &lt;span style="color: #2b91af"&gt;DtsProperty &lt;/span&gt;connectionStringProp = cm.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;ConnectionString&amp;quot;&lt;/span&gt;];
            connectionStringProp.SetExport(cm, &lt;span style="color: blue"&gt;true&lt;/span&gt;);
        }

        &lt;span style="color: green"&gt;// Export the configuration file
        &lt;/span&gt;package.ExportConfigurationFile(&lt;span style="color: #a31515"&gt;@&amp;quot;c:\temp\config.dtsconfig&amp;quot;&lt;/span&gt;);
    }

    &lt;span style="color: blue"&gt;static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Package &lt;/span&gt;CreatePackage()
    {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;p = &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 = p.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: blue"&gt;var &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;;
        &lt;span style="color: #2b91af"&gt;Debug&lt;/span&gt;.Assert(taskHost != &lt;span style="color: blue"&gt;null&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Unexpected task type&amp;quot;&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: blue"&gt;var &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: #2b91af"&gt;Debug&lt;/span&gt;.Assert(pipeline != &lt;span style="color: blue"&gt;null&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Unexpected InnerObject type&amp;quot;&lt;/span&gt;);

        &lt;span style="color: green"&gt;// Create a package variable to store the row count value
        &lt;/span&gt;p.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 = p.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;MyConnection&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;span style="color: blue"&gt;return &lt;/span&gt;p;
    }
}&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=9455404" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><item><title>API Sample - Programmatically add a configuration file to a package</title><link>http://blogs.msdn.com/mattm/archive/2009/03/02/api-sample-programmatically-add-a-configuration-file-to-a-package.aspx</link><pubDate>Tue, 03 Mar 2009 02:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9455390</guid><dc:creator>mmasson</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9455390.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9455390</wfw:commentRss><description>&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Update&amp;nbsp;2009-03-03&lt;/STRONG&gt;: Darren Green has a &lt;A class="" href="http://www.sqlis.com/post/Creating-packages-in-code-Package-Configurations.aspx" mce_href="http://www.sqlis.com/post/Creating-packages-in-code-Package-Configurations.aspx"&gt;post which covers the other configuration types as well&lt;/A&gt;. &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;This sample programmatically adds a reference to an existing configuration file to a package.&lt;/P&gt;
&lt;P&gt;Things to note:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The CreatePackage() method just creates a package (it doesn’t matter what is in it). Typically you’d be using this code to add a configuration to an existing package (doing a Package.LoadFromXml() or something similar)&lt;/LI&gt;
&lt;LI&gt;For this approach to work, the paths in the configuration file must be the same in every package.&lt;/LI&gt;&lt;/UL&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;class &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;ConfigurationReference
&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;//
        // Add a reference to an existing configuration file.
        // Note all property paths must match.
        //
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Package &lt;/SPAN&gt;package = CreatePackage();

        &lt;SPAN style="COLOR: green"&gt;// Enable configurations
        &lt;/SPAN&gt;package.EnableConfigurations = &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;;

        &lt;SPAN style="COLOR: green"&gt;// Create the configuration reference
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Configuration &lt;/SPAN&gt;config = package.Configurations.Add();
        config.Name = &lt;SPAN style="COLOR: #a31515"&gt;"Configuration"&lt;/SPAN&gt;;
        config.ConfigurationType = &lt;SPAN style="COLOR: #2b91af"&gt;DTSConfigurationType&lt;/SPAN&gt;.ConfigFile;
        config.ConfigurationString = &lt;SPAN style="COLOR: #a31515"&gt;@"c:\temp\config.dtsconfig"&lt;/SPAN&gt;;
    }

    &lt;SPAN style="COLOR: blue"&gt;static &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Package &lt;/SPAN&gt;CreatePackage()
    {
        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;p = &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 = p.Executables.Add(&lt;SPAN style="COLOR: #a31515"&gt;"STOCK:PipelineTask"&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: blue"&gt;var &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;;
        &lt;SPAN style="COLOR: #2b91af"&gt;Debug&lt;/SPAN&gt;.Assert(taskHost != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"Unexpected task type"&lt;/SPAN&gt;);

        taskHost.Name = &lt;SPAN style="COLOR: #a31515"&gt;"Data Flow Task"&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: blue"&gt;var &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: #2b91af"&gt;Debug&lt;/SPAN&gt;.Assert(pipeline != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"Unexpected InnerObject type"&lt;/SPAN&gt;);

        &lt;SPAN style="COLOR: green"&gt;// Create a package variable to store the row count value
        &lt;/SPAN&gt;p.Variables.Add(&lt;SPAN style="COLOR: #a31515"&gt;"RowCountVar"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"User"&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 = p.Connections.Add(&lt;SPAN style="COLOR: #a31515"&gt;"OLEDB"&lt;/SPAN&gt;);
        connection.Name = &lt;SPAN style="COLOR: #a31515"&gt;"MyConnection"&lt;/SPAN&gt;;
        connection.ConnectionString = &lt;SPAN style="COLOR: #a31515"&gt;"Data Source=localhost;Initial Catalog=AdventureWorksDW2008;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;"&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;"DTSAdapter.OleDbSource"&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;"OleDb Source"&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;"AccessMode"&lt;/SPAN&gt;, 0);
        srcDesignTimeComponent.SetComponentProperty(&lt;SPAN style="COLOR: #a31515"&gt;"OpenRowset"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"[DimCustomer]"&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;"DTSTransform.RowCount"&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;"VariableName"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"User::RowCountVar"&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;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;p;
    }
}&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9455390" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item><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>API Sample - OleDB source and OleDB destination</title><link>http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-oledb-source-and-oledb-destination.aspx</link><pubDate>Wed, 31 Dec 2008 01:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9257695</guid><dc:creator>mmasson</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9257695.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9257695</wfw:commentRss><description>&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This sample creates a data flow package with an OleDB Source component which reads from a local AdventureWorksDW2008 database, and writes to a different table in the same database using an OleDB Destination.&lt;/P&gt;
&lt;P&gt;Items of interest:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The AccessMode property is an int value which controls how you’re retrieving/sending data. Once you set a value, you need to set a value for the related property (see the table below). For example, if you set the AccessMode for the OLEDB Source to 2 (SQL Command), you should set a SQL statement value for the SqlCommand property. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;OLEDB Source&lt;/STRONG&gt;&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2 width=662 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=94&gt;&lt;STRONG&gt;Value&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=113&gt;&lt;STRONG&gt;Text&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;&lt;STRONG&gt;Related Property&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=351&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=94&gt;0&lt;/TD&gt;
&lt;TD class="" vAlign=top width=113&gt;Open Rowset&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;OpenRowset&lt;/TD&gt;
&lt;TD class="" vAlign=top width=351&gt;You provide the name of a table or view.&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=94&gt;1&lt;/TD&gt;
&lt;TD class="" vAlign=top width=113&gt;Open Rowset from Variable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;OpenRowsetVariable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=351&gt;You provide the name of a variable that contains the name of a table or view.&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=94&gt;2&lt;/TD&gt;
&lt;TD class="" vAlign=top width=113&gt;SQL Command&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;SqlCommand&lt;/TD&gt;
&lt;TD class="" vAlign=top width=351&gt;
&lt;P&gt;You provide a SQL statement.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=94&gt;3&lt;/TD&gt;
&lt;TD class="" vAlign=top width=117&gt;SQL Command from Variable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;SqlCommandVariable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=351&gt;You provide the name of a variable that contains the SQL statement you wish to execute.&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&lt;STRONG&gt;OLEDB Destination&lt;/STRONG&gt;&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2 width=663 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=93&gt;&lt;STRONG&gt;Value&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=114&gt;&lt;STRONG&gt;Text&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=106&gt;&lt;STRONG&gt;Related Property&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=348&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=93&gt;0&lt;/TD&gt;
&lt;TD class="" vAlign=top width=114&gt;Open Rowset&lt;/TD&gt;
&lt;TD class="" vAlign=top width=106&gt;OpenRowset&lt;/TD&gt;
&lt;TD class="" vAlign=top width=348&gt;
&lt;P&gt;You provide the name of a table or view.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=93&gt;1&lt;/TD&gt;
&lt;TD class="" vAlign=top width=114&gt;Open Rowset from Variable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=106&gt;OpenRowsetVariable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=348&gt;You provide the name of a variable that contains the name of a table or view.&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=93&gt;2&lt;/TD&gt;
&lt;TD class="" vAlign=top width=114&gt;SQL Command&lt;/TD&gt;
&lt;TD class="" vAlign=top width=106&gt;SqlCommand&lt;/TD&gt;
&lt;TD class="" vAlign=top width=348&gt;
&lt;P&gt;You provide a SQL statement.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=93&gt;3&lt;/TD&gt;
&lt;TD class="" vAlign=top width=114&gt;Open Rowset Using Fastload&lt;/TD&gt;
&lt;TD class="" vAlign=top width=106&gt;OpenRowset&lt;/TD&gt;
&lt;TD class="" vAlign=top width=348&gt;You provide the name of a table or view.&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=93&gt;4&lt;/TD&gt;
&lt;TD class="" vAlign=top width=118&gt;Open Rowset Using Fastload from Variable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=106&gt;OpenRowsetVariable&lt;/TD&gt;
&lt;TD class="" vAlign=top width=348&gt;
&lt;P&gt;You provide the name of a variable that contains the name of a table or view.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;UL&gt;
&lt;LI&gt;Calling ReinitializeMetadata() causes the component to fetch the table metadata. This should only be called after setting the AccessMode and related property. &lt;/LI&gt;&lt;/UL&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: gray"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;Creates a data flow package with a source and destination sharing a connection manager. 
&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;The source reads all columns from the [DimCustomer] table, and the destination writes
&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;them to the [DimCustomer_Copy] table.
&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &amp;lt;/summary&amp;gt;
&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;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;"STOCK:PipelineTask"&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;"Data Flow Task"&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;"OLEDB"&lt;/SPAN&gt;);
    connection.Name = &lt;SPAN style="COLOR: #a31515"&gt;"localhost"&lt;/SPAN&gt;;
    connection.ConnectionString = &lt;SPAN style="COLOR: #a31515"&gt;"Data Source=localhost;Initial Catalog=AdventureWorksDW2008;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;"&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;"DTSAdapter.OleDbSource"&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;"OleDb Source"&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;"AccessMode"&lt;/SPAN&gt;, 0);
    srcDesignTimeComponent.SetComponentProperty(&lt;SPAN style="COLOR: #a31515"&gt;"OpenRowset"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"[DimCustomer]"&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 OLEDB Destination
    //

    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;IDTSComponentMetaData100 &lt;/SPAN&gt;destComponent = pipeline.ComponentMetaDataCollection.New();
    destComponent.ComponentClassID = &lt;SPAN style="COLOR: #a31515"&gt;"DTSAdapter.OleDbDestination"&lt;/SPAN&gt;;
    destComponent.ValidateExternalMetadata = &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;;

    &lt;SPAN style="COLOR: #2b91af"&gt;IDTSDesigntimeComponent100 &lt;/SPAN&gt;destDesignTimeComponent = destComponent.Instantiate();
    destDesignTimeComponent.ProvideComponentProperties();
    destComponent.Name = &lt;SPAN style="COLOR: #a31515"&gt;"OleDb Destination"&lt;/SPAN&gt;;

    destDesignTimeComponent.SetComponentProperty(&lt;SPAN style="COLOR: #a31515"&gt;"AccessMode"&lt;/SPAN&gt;, 3);
    destDesignTimeComponent.SetComponentProperty(&lt;SPAN style="COLOR: #a31515"&gt;"OpenRowset"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"[DimCustomer_Copy]"&lt;/SPAN&gt;);

    &lt;SPAN style="COLOR: green"&gt;// set connection
    &lt;/SPAN&gt;destComponent.RuntimeConnectionCollection[0].ConnectionManager = &lt;SPAN style="COLOR: #2b91af"&gt;DtsConvert&lt;/SPAN&gt;.GetExtendedInterface(connection);
    destComponent.RuntimeConnectionCollection[0].ConnectionManagerID = connection.ID;

    &lt;SPAN style="COLOR: green"&gt;// get metadata
    &lt;/SPAN&gt;destDesignTimeComponent.AcquireConnections(&lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;);
    destDesignTimeComponent.ReinitializeMetaData();
    destDesignTimeComponent.ReleaseConnections();

    &lt;SPAN style="COLOR: green"&gt;//
    // Connect source and destination
    //

    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;IDTSPath100 &lt;/SPAN&gt;path = pipeline.PathCollection.New();
    path.AttachPathAndPropagateNotifications(srcComponent.OutputCollection[0], destComponent.InputCollection[0]);

    &lt;SPAN style="COLOR: green"&gt;//
    // Configure the destination
    // 

    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;IDTSInput100 &lt;/SPAN&gt;destInput = destComponent.InputCollection[0];
    &lt;SPAN style="COLOR: #2b91af"&gt;IDTSVirtualInput100 &lt;/SPAN&gt;destVirInput = destInput.GetVirtualInput();
    &lt;SPAN style="COLOR: #2b91af"&gt;IDTSInputColumnCollection100 &lt;/SPAN&gt;destInputCols = destInput.InputColumnCollection;
    &lt;SPAN style="COLOR: #2b91af"&gt;IDTSExternalMetadataColumnCollection100 &lt;/SPAN&gt;destExtCols = destInput.ExternalMetadataColumnCollection;
    &lt;SPAN style="COLOR: #2b91af"&gt;IDTSOutputColumnCollection100 &lt;/SPAN&gt;sourceColumns = srcComponent.OutputCollection[0].OutputColumnCollection;

    &lt;SPAN style="COLOR: green"&gt;// The OLEDB destination requires you to hook up the external columns
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;foreach &lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;IDTSOutputColumn100 &lt;/SPAN&gt;outputCol &lt;SPAN style="COLOR: blue"&gt;in &lt;/SPAN&gt;sourceColumns)
    {
        &lt;SPAN style="COLOR: green"&gt;// Get the external column id
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;IDTSExternalMetadataColumn100 &lt;/SPAN&gt;extCol = (&lt;SPAN style="COLOR: #2b91af"&gt;IDTSExternalMetadataColumn100&lt;/SPAN&gt;)destExtCols[outputCol.Name];
        &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(extCol != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)
        {
            &lt;SPAN style="COLOR: green"&gt;// Create an input column from an output col of previous component.
            &lt;/SPAN&gt;destVirInput.SetUsageType(outputCol.ID, &lt;SPAN style="COLOR: #2b91af"&gt;DTSUsageType&lt;/SPAN&gt;.UT_READONLY);
            &lt;SPAN style="COLOR: #2b91af"&gt;IDTSInputColumn100 &lt;/SPAN&gt;inputCol = destInputCols.GetInputColumnByLineageID(outputCol.ID);
            &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(inputCol != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)
            {
                &lt;SPAN style="COLOR: green"&gt;// map the input column with an external metadata column
                &lt;/SPAN&gt;destDesignTimeComponent.MapInputColumn(destInput.ID, inputCol.ID, extCol.ID);
            }
        }
    }
}&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9257695" width="1" height="1"&gt;</description><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>Samples for creating SSIS packages programmatically</title><link>http://blogs.msdn.com/mattm/archive/2008/12/30/samples-for-creating-ssis-packages-programmatically.aspx</link><pubDate>Wed, 31 Dec 2008 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9257608</guid><dc:creator>mmasson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattm/comments/9257608.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattm/commentrss.aspx?PostID=9257608</wfw:commentRss><description>&lt;P&gt;This is an index post for the series of posts with examples on how to create packages programmatically. Creating and adding tasks to a control flow is pretty straightforward, but programmatically adding data flow components can be tricky due to the interaction with the native COM APIs. Each post will provide a simple scenario for using each component.&lt;/P&gt;
&lt;P&gt;All samples are done using SQL Server 2008, but will also work with 2005 with minor code modifications. &lt;/P&gt;
&lt;P&gt;I’ll continue to update this post as more samples are added. Please post in the comments if there are specific data flow components you’d like to see.&lt;/P&gt;
&lt;H3&gt;General&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2008/12/30/create-a-package-with-a-data-flow-task.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2008/12/30/create-a-package-with-a-data-flow-task.aspx"&gt;Create a package with a data flow task&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2009/08/03/debugging-a-comexception-during-package-generation.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2009/08/03/debugging-a-comexception-during-package-generation.aspx"&gt;Debugging a COMException during package generation&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2009/08/03/looking-up-ssis-hresult-comexception-errorcode.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2009/08/03/looking-up-ssis-hresult-comexception-errorcode.aspx"&gt;Looking up HResults / COMException Error Codes&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Sources&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-oledb-source-and-oledb-destination.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-oledb-source-and-oledb-destination.aspx"&gt;OLEDB Source and OLEDB Destination&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-ado-net-source.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-ado-net-source.aspx"&gt;ADO.Net Source&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Transforms&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-conditional-split.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-conditional-split.aspx"&gt;Conditional Split&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2009/01/02/api-sample-data-conversion.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2009/01/02/api-sample-data-conversion.aspx"&gt;Data Conversion&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2009/01/02/api-sample-lookup-transform.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2009/01/02/api-sample-lookup-transform.aspx"&gt;Lookup&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-row-count-transform.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-row-count-transform.aspx"&gt;Row Count&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Destinations&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-oledb-source-and-oledb-destination.aspx" mce_href="http://blogs.msdn.com/mattm/archive/2008/12/30/api-sample-oledb-source-and-oledb-destination.aspx"&gt;OLEDB Source and OLEDB Destination&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;For an end to end solution, check out the &lt;A href="http://www.codeplex.com/SQLSrvIntegrationSrv/Release/ProjectReleases.aspx?ReleaseId=17647" mce_href="http://www.codeplex.com/SQLSrvIntegrationSrv/Release/ProjectReleases.aspx?ReleaseId=17647"&gt;Package Generation sample&lt;/A&gt; available on codeplex.&lt;/P&gt;
&lt;H3&gt;Other resources&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms345167.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms345167.aspx"&gt;Building Packages Programmatically&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms403347.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms403347.aspx"&gt;Saving a Package Programmatically&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa337077.aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa337077.aspx"&gt;Running and Managing Packages Programmatically&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9257608" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattm/archive/tags/API/default.aspx">API</category></item></channel></rss>