Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SSIS中以编程方式创建数据流任务列表_C#_Com_Ssis - Fatal编程技术网

C# 在SSIS中以编程方式创建数据流任务列表

C# 在SSIS中以编程方式创建数据流任务列表,c#,com,ssis,C#,Com,Ssis,我正在编写一些代码来生成定制的SSIS包。我使用了以下代码来生成PipelineTask组件: private static List<string> getAccessTables() { List<string> tables = new List<string>(); OleDbConnection con = new OleDbConnection(AccessConnestionString);

我正在编写一些代码来生成定制的SSIS包。我使用了以下代码来生成PipelineTask组件:

    private static List<string> getAccessTables()
    {
        List<string> tables = new List<string>();
        OleDbConnection con = new OleDbConnection(AccessConnestionString);
        con.Open();

        OleDbCommand com = con.CreateCommand();

        IEnumerable<DataRow> dtTables = con.GetSchema("tables").AsEnumerable();
        tables = dtTables.Where(row => (!row[2].ToString().StartsWith("MSys")
            && !row[2].ToString().Contains('~'))).OrderBy(row => row[2].ToString()).Select(row => row[2].ToString()).ToList();
        File.WriteAllLines(@"C:\TableList", tables);
        return tables;

    }




    public static void BuildPackage(Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel Dts)
    {
        var tables = getAccessTables();

        var app = new Application();

        Package package = new Package();
        package.Name = "AccessToFlatFile";

        // Add the SQL OLE-DB connection
        ConnectionManager connectionManagerOleDb = package.Connections.Add("OLEDB");
        connectionManagerOleDb.Name = "OLEDB";
        connectionManagerOleDb.ConnectionString = AccessConnestionString;

        // Add the Data Flow Task 
        int cnt = 64;
        Executable tsk = null, prevTsk = null;

        for (int i = 0; i < Math.Ceiling(tables.Count * 1.0 / cnt * 1.0); i++)
        {
            if (i > 0)
            {
                prevTsk = tsk;
            }
            tsk = package.Executables.Add("STOCK:PipelineTask");
            //tsk = package.Executables[i];

            // Get the task host wrapper, and the Data Flow task
            TaskHost taskHost = tsk as TaskHost;
            MainPipe dataFlowTask = (MainPipe)taskHost.InnerObject;

            if (i > 0)
            {
                //prevTsk = package.Executables[i-1];
                PrecedenceConstraint pcPipelineTask =
                       package.PrecedenceConstraints.Add((Executable)prevTsk, (Executable)tsk);
            }

            foreach (var table in tables.Skip(cnt * i).Take(cnt))
            {

                // Add the Flat File DB connection, basic info only, will define add columns later
                ConnectionManager connectionManagerFlatFile = package.Connections.Add("FLATFILE");
                connectionManagerFlatFile.ConnectionString = @"G:\Dest\" + table + ".txt";
                connectionManagerFlatFile.Name = "FlatFile_" + table;
                connectionManagerFlatFile.Properties["Format"].SetValue(connectionManagerFlatFile, "Delimited");
                connectionManagerFlatFile.Properties["ColumnNamesInFirstDataRow"].SetValue(connectionManagerFlatFile, true);
                connectionManagerFlatFile.Properties["Unicode"].SetValue(connectionManagerFlatFile, true);



                // Add OLE-DB source component
                IDTSComponentMetaData100 componentSource = dataFlowTask.ComponentMetaDataCollection.New();
                componentSource.Name = "OLEDBSource_" + table;
                componentSource.ComponentClassID = app.PipelineComponentInfos["OLE DB Source"].CreationName;
                //            componentSource.ComponentClassID = "DTSAdapter.OleDbSource.3";

                // Get OLE-DB source design-time instance, and initialise component
                CManagedComponentWrapper instanceSource = componentSource.Instantiate();
                instanceSource.ProvideComponentProperties();

                // Set source connection
                componentSource.RuntimeConnectionCollection[0].ConnectionManagerID = connectionManagerOleDb.ID;
                componentSource.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.GetExtendedInterface(connectionManagerOleDb);

                // Set the source properties
                instanceSource.SetComponentProperty("AccessMode", 2);
                instanceSource.SetComponentProperty("SqlCommand", "SELECT * FROM [" + table + "]");

                // Reinitialize the metadata, refresh columns
                instanceSource.AcquireConnections(null);
                instanceSource.ReinitializeMetaData();
                instanceSource.ReleaseConnections();
                componentSource.Name = "OLEDBSource_" + table;


                // Add Flat File destination
                IDTSComponentMetaData100 componentDestination = dataFlowTask.ComponentMetaDataCollection.New();
                componentDestination.Name = "FlatFileDestination_" + table;
                componentDestination.ComponentClassID = app.PipelineComponentInfos["Flat File Destination"].CreationName;

                // Get Flat File destination design-time instance, and initialise component
                CManagedComponentWrapper instanceDestination = componentDestination.Instantiate();
                instanceDestination.ProvideComponentProperties();

                // Set destination connection
                componentDestination.RuntimeConnectionCollection[0].ConnectionManagerID = connectionManagerFlatFile.ID;
                componentDestination.RuntimeConnectionCollection[0].ConnectionManager =
                    DtsConvert.GetExtendedInterface(connectionManagerFlatFile);

                IDTSPath100 path = dataFlowTask.PathCollection.New();
                path.AttachPathAndPropagateNotifications(componentSource.OutputCollection[0],
                    componentDestination.InputCollection[0]);


                // Get input and virtual input for destination to select and map columns
                IDTSInput100 destinationInput = componentDestination.InputCollection[0];
                IDTSVirtualInput100 destinationVirtualInput = destinationInput.GetVirtualInput();
                IDTSVirtualInputColumnCollection100 destinationVirtualInputColumns =
                    destinationVirtualInput.VirtualInputColumnCollection;

                // Get native flat file connection 
                RuntimeWrapper.IDTSConnectionManagerFlatFile100 connectionFlatFile =
                    connectionManagerFlatFile.InnerObject as RuntimeWrapper.IDTSConnectionManagerFlatFile100;

                // Create flat file connection columns to match pipeline
                int indexMax = destinationVirtualInputColumns.Count - 1;
                for (int index = 0; index <= indexMax; index++)
                {
                    // Get input column to replicate in flat file
                    IDTSVirtualInputColumn100 virtualInputColumn = destinationVirtualInputColumns[index];

                    // Add column to Flat File connection manager
                    RuntimeWrapper.IDTSConnectionManagerFlatFileColumn100 flatFileColumn =
                        connectionFlatFile.Columns.Add() as RuntimeWrapper.IDTSConnectionManagerFlatFileColumn100;
                    flatFileColumn.ColumnType = "Delimited";
                    flatFileColumn.ColumnWidth = virtualInputColumn.Length;
                    flatFileColumn.DataPrecision = virtualInputColumn.Precision;
                    flatFileColumn.DataScale = virtualInputColumn.Scale;
                    flatFileColumn.DataType = virtualInputColumn.DataType;
                    RuntimeWrapper.IDTSName100 columnName = flatFileColumn as RuntimeWrapper.IDTSName100;
                    columnName.Name = virtualInputColumn.Name;

                    if (index < indexMax)
                        flatFileColumn.ColumnDelimiter = "||";
                    else
                        flatFileColumn.ColumnDelimiter = "~~";
                }

                // Reinitialize the metadata, generating external columns from flat file columns
                instanceDestination.AcquireConnections(null);
                instanceDestination.ReinitializeMetaData();
                instanceDestination.ReleaseConnections();

                // Select and map destination columns
                foreach (IDTSVirtualInputColumn100 virtualInputColumn in destinationVirtualInputColumns)
                {
                    // Select column, and retain new input column
                    IDTSInputColumn100 inputColumn = instanceDestination.SetUsageType(destinationInput.ID,
                        destinationVirtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY);
                    // Find external column by name
                    IDTSExternalMetadataColumn100 externalColumn =
                        destinationInput.ExternalMetadataColumnCollection[inputColumn.Name];
                    // Map input column to external column
                    instanceDestination.MapInputColumn(destinationInput.ID, inputColumn.ID, externalColumn.ID);
                }
            }


            app.SaveToXml(String.Format(@"G:\Dest\{0}.dtsx", package.Name + tables.Count.ToString()), package, null);

            package.Dispose();
        }
    }

}
私有静态列表getAccessTables()
{
列表表=新列表();
OleDbConnection con=新的OleDbConnection(AccessConnestinString);
con.Open();
OleDbCommand com=con.CreateCommand();
IEnumerable dtTables=con.GetSchema(“表”).AsEnumerable();
tables=dtTables.Where(row=>(!row[2].ToString().StartsWith(“MSys”)
&&!行[2].ToString().Contains('~')).OrderBy(行=>行[2].ToString()).Select(行=>行[2].ToString()).ToList();
writeAllines(@“C:\TableList”,tables);
返回表;
}
公共静态void BuildPackage(Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel Dts)
{
var tables=getAccessTables();
var app=新应用程序();
包=新包();
package.Name=“AccessToFlatFile”;
//添加SQL OLE-DB连接
ConnectionManager connectionManagerOleDb=package.Connections.Add(“OLEDB”);
connectionManagerOleDb.Name=“OLEDB”;
ConnectionManagerRoleDB.ConnectionString=AccessConnestString;
//添加数据流任务
int cnt=64;
可执行文件tsk=null,prevTsk=null;
对于(int i=0;i<数学上限(tables.Count*1.0/cnt*1.0);i++)
{
如果(i>0)
{
prevTsk=tsk;
}
tsk=package.Executables.Add(“STOCK:PipelineTask”);
//tsk=包.可执行文件[i];
//获取任务主机包装器和数据流任务
TaskHost TaskHost=tsk作为TaskHost;
MainPipe dataFlowTask=(MainPipe)taskHost.InnerObject;
如果(i>0)
{
//prevTsk=package.Executables[i-1];
优先约束pcPipelineTask=
package.precenceconstraints.Add((可执行)prevTsk,(可执行)tsk);
}
foreach(tables.Skip(cnt*i.Take(cnt))中的var表)
{
//添加平面文件数据库连接(仅限基本信息),稍后将定义添加列
ConnectionManager connectionManagerFlatFile=package.Connections.Add(“FLATFILE”);
connectionManagerFlatFile.ConnectionString=@“G:\Dest\”+表+“.txt”;
connectionManagerFlatFile.Name=“FlatFile”+表格;
connectionManagerFlatFile.Properties[“Format”].SetValue(connectionManagerFlatFile,“分隔”);
connectionManagerFlatFile.Properties[“ColumnNamesInFirstDataRow”].SetValue(connectionManagerFlatFile,true);
connectionManagerFlatFile.Properties[“Unicode”].SetValue(connectionManagerFlatFile,true);
//添加OLE-DB源组件
IDTSComponentMetaData100 componentSource=dataFlowTask.ComponentMetaDataCollection.New();
componentSource.Name=“OLEDBSource”+表格;
componentSource.ComponentClassID=app.PipelineComponentInfo[“OLE DB Source”].CreationName;
//componentSource.ComponentClassID=“DTSAdapter.OleDbSource.3”;
//获取OLE-DB源代码设计时实例,并初始化组件
CManagedComponentWrapper instanceSource=componentSource.Instantiate();
instanceSource.ProvideComponentProperties();
//设置源连接
componentSource.RuntimeConnectionCollection[0]。ConnectionManagerID=ConnectionManagerLedb.ID;
componentSource.RuntimeConnectionCollection[0]。ConnectionManager=DtsConvert.GetExtendedInterface(ConnectionManagerLedb);
//设置源属性
SetComponentProperty(“AccessMode”,2);
instanceSource.SetComponentProperty(“SqlCommand”,“从[“+表+”]中选择*”);
//重新初始化元数据,刷新列
instanceSource.AcquireConnections(空);
instanceSource.ReinitializeMetaData();
instanceSource.ReleaseConnections();
componentSource.Name=“OLEDBSource”+表格;
//添加平面文件目标
IDTSComponentMetaData100 componentDestination=dataFlowTask.ComponentMetaDataCollection.New();
componentDestination.Name=“FlatFileDestination”+表格;
componentDestination.ComponentClassID=app.pipelineComponentInfo[“平面文件目标”].CreationName;
//获取平面文件目标设计时实例,并初始化组件
CManagedComponentWrapper instanceDestination=componentDestination.Instantiate();
instanceDestination.ProvideComponentProperties();
//设置目标连接
componentDestination.RuntimeConnectionCollection[0]。ConnectionManagerID=connectionManagerFlatFile.ID;
componentDestination.RuntimeConnectionCollection[0]。ConnectionManager=
GetExtendedInterface(connectionManagerFlatFile);
IDTSPath100 path=dataFlowTask.PathCollection.New();
path.AttachPathAndPropagateNotifications(componentSource.OutputCollection[0],
componentDestination.InputCollection[0]);
//获取要选择和映射列的目标的输入和虚拟输入
IDTSInput100 destinationInput=componentDestination.InputCollection[0];
IDTSVirtualInput100 destinationVirtualInput=destinationInput.GetVirtualInput();
IDTSVirtualInputColumnCollection100目标VirtualInputColumns=
destinationVirtualInput.VirtualInputColumnCollection;
//得到本机单位f
    private static List<string> getAccessTables()
    {
        List<string> tables = new List<string>() {"A", "B", "C", "D", "E", "F", "G" };
        return tables;
    }

    public static void BuildPackage(/*Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel Dts*/)
    {
        var tables = getAccessTables();
        var app = new Application();

        Package package = new Package();
        package.Name = "AccessToFlatFile";

        // Add the Data Flow Task 
        int cnt = 1;
        Executable tsk = null, prevTsk = null;

        for (int i = 0; i < Math.Ceiling(tables.Count * 1.0 / cnt * 1.0); i++)
        {
            if (i > 0)
            {
                prevTsk = tsk;
            }

            tsk = package.Executables.Add("STOCK:PipelineTask");
            //tsk = package.Executables[i];

            // Get the task host wrapper, and the Data Flow task
            TaskHost taskHost = tsk as TaskHost;
            taskHost.Name = string.Format("DFT {0}", tables[i]);

            if (i > 0)
            {
                Console.WriteLine(string.Format("Linking {0:36} to {1:36}", (tsk as TaskHost).Name, (prevTsk as TaskHost).Name));
                //prevTsk = package.Executables[i-1];
                PrecedenceConstraint pcPipelineTask =
                       package.PrecedenceConstraints.Add((Executable)prevTsk, (Executable)tsk);
            }
        }

        app.SaveToXml(String.Format(@"C:\Users\bfellows\documents\visual studio 2013\Projects\WTF\WTF\{0}.dtsx", package.Name + tables.Count.ToString()), package, null);

        package.Dispose();

        Console.WriteLine();
        AltBuildPackage();
    }

    public static void AltBuildPackage(/*Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel Dts*/)
    {
        var tables = getAccessTables();
        var app = new Application();

        Package package = new Package();
        package.Name = "AccessToFlatFile";

        // Add the Data Flow Task 
        int cnt = 1;
        Executable tsk = null, prevTsk = null;

        for (int i = 0; i < Math.Ceiling(tables.Count * 1.0 / cnt * 1.0); i++)
        {
            tsk = package.Executables.Add("STOCK:PipelineTask");
            // This line is what is causing you pain. I don't know why
            // Theory is that you're losing your reference
            Console.WriteLine(string.Format("\tHash before {0}", tsk.GetHashCode()));
            tsk = package.Executables[i];
            Console.WriteLine(string.Format("\tHash after  {0}", tsk.GetHashCode()));


            // Get the task host wrapper, and the Data Flow task
            TaskHost taskHost = tsk as TaskHost;
            taskHost.Name = string.Format("DFT {0}", tables[i]);

            // if the above tsk = assignment is delayed to this point
            // the reassignment works fine.
            tsk = package.Executables[i];

            if (i > 0)
            {                    
                prevTsk = package.Executables[i - 1];
                Console.WriteLine(string.Format("Linking {0:36} to {1:36}", (tsk as TaskHost).Name, (prevTsk as TaskHost).Name));
                PrecedenceConstraint pcPipelineTask =
                       package.PrecedenceConstraints.Add((Executable)prevTsk, (Executable)tsk);
            }
        }

        app.SaveToXml(String.Format(@"C:\Users\bfellows\documents\visual studio 2013\Projects\WTF\WTF\Alt{0}.dtsx", package.Name + tables.Count.ToString()), package, null);

        package.Dispose();
    }
Linking DFT B to DFT A
Linking DFT C to DFT B
Linking DFT D to DFT C
Linking DFT E to DFT D
Linking DFT F to DFT E
Linking DFT G to DFT F

        Hash before 94299808
        Hash after  94299808
        Hash before 94320648
        Hash after  94299808
Linking DFT B to {7E0B0C2B-7C69-4EDF-9EDE-8B2382B8221D}
        Hash before 94346952
        Hash after  94299808
Linking DFT C to {7E0B0C2B-7C69-4EDF-9EDE-8B2382B8221D}