Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Sql server 2008 创建SSIS自定义数据流组件&x2B;SSIS 2008_Sql Server 2008_Ssis_Custom Component - Fatal编程技术网

Sql server 2008 创建SSIS自定义数据流组件&x2B;SSIS 2008

Sql server 2008 创建SSIS自定义数据流组件&x2B;SSIS 2008,sql-server-2008,ssis,custom-component,Sql Server 2008,Ssis,Custom Component,我是SSIS自定义组件的新手。刚开始编写一个组件,其中输入行计数永远不会与输出行计数相同。foreach输入行执行一些验证并生成需要映射到输出缓冲区的n行 因此,在设计时验证编码之后,一切都很好 我的运行时代码如下: public override void PreExecute() { IDTSInput100 input = ComponentMetaData.InputCollection[0]; inputBufferColumnIndex

我是SSIS自定义组件的新手。刚开始编写一个组件,其中输入行计数永远不会与输出行计数相同。foreach输入行执行一些验证并生成需要映射到输出缓冲区的n行

因此,在设计时验证编码之后,一切都很好

我的运行时代码如下:

    public override void PreExecute()
    {
        IDTSInput100 input = ComponentMetaData.InputCollection[0];
        inputBufferColumnIndex = new int[input.InputColumnCollection.Count];

        for (int x = 0; x < input.InputColumnCollection.Count; x++)
        {
            IDTSInputColumn100 column = input.InputColumnCollection[x];
            inputBufferColumnIndex[x] = BufferManager.FindColumnByLineageID  (input.Buffer, column.LineageID);
        }

        IDTSOutput100 output = ComponentMetaData.OutputCollection[0];
        outputBufferColumnIndex = new int[output.OutputColumnCollection.Count];

        for (int x = 0; x < output.OutputColumnCollection.Count; x++)
        {
            IDTSOutputColumn100 outcol = output.OutputColumnCollection[x];
            outputBufferColumnIndex[x] = BufferManager.FindColumnByLineageID(input.Buffer, outcol.LineageID);
        }

    }


    public override void ProcessInput(int inputID, PipelineBuffer buffer)
    {
        if(!buffer.EndOfRowset)
        {
            while (buffer.NextRow())
            {
                var rec = new Record
                                 {
                                     Source = buffer[0].ToString(),
                                     Nk = buffer[1].ToString(),
                                     Guid = new Guid(buffer[2].ToString()),
                                     FromDate = Convert.ToDateTime(buffer[3].ToString()),
                                     ToDate = Convert.ToDateTime(buffer[4].ToString())
                                 };
                sourceRecords.Add(rec);
            }
            ProcessArray(sourceRecords,buffer);
        }
    }
    public void ProcessArray(List<Record> records, PipelineBuffer buffer)
    {
        //Get Distinct NKs from the source Records
        List<string> nKs = (from c in records select c.Nk).Distinct().ToList();


        foreach (var nk in nKs)
        {
            //Get all the record for particular NK
            List<Record> filteredRecords = (from c in sourceRecords where c.Nk == nk select c)
                                                .OrderBy(c => c.Source)
                                                .ThenBy(c => c.FromDate)
                                                .ThenBy(c => c.ToDate).ToList();

            foreach (var filteredRecord in filteredRecords)
            {
                _start = filteredRecord.FromDate;
                _end = filteredRecord.ToDate;
                while (filteredRecord.WriteComplete == false)
                {
                    foreach (var record in filteredRecords)
                    {
                        if (record.FromDate > _start && record.FromDate < _end) _end = record.ToDate;
                        if (record.ToDate < _end && record.ToDate > _start) _end = record.ToDate;
                    }

                    //Output0Buffer.AddRow();
                    //Output0Buffer.outSource = filteredRecord.Source;
                    //Output0Buffer.outNK = filteredRecord.Nk;
                    //Output0Buffer.outRecid = filteredRecord.Guid;
                    //Output0Buffer.outFromDate = _start;
                    //Output0Buffer.outToDate = _end;
                    buffer.SetString(5,filteredRecord.Source);
                    buffer.SetString(6,filteredRecord.Nk);
                    buffer.SetGuid(7,filteredRecord.Guid);
                    buffer.SetDateTime(8,filteredRecord.FromDate);
                    buffer.SetDateTime(9,filteredRecord.ToDate);

                    _start = _end;
                    _end = filteredRecord.ToDate;

                    if (_start == _end) filteredRecord.WriteComplete = true;
                }
            }
        }
    }
}
public class Record
{
    public Guid Guid { get; set; }
    public string Nk { get; set; }
    public string Source { get; set; }
    public DateTime FromDate { get; set; }
    public DateTime ToDate { get; set; }
    public bool WriteComplete { get; set; }
}
public override void PreExecute()
{
IDTSInput100输入=ComponentMetaData.InputCollection[0];
inputBufferColumnIndex=newint[input.InputColumnCollection.Count];
对于(int x=0;xc.Source)
.ThenBy(c=>c.FromDate)
.ThenBy(c=>c.ToDate).ToList();
foreach(过滤记录中的var过滤记录)
{
_开始=filteredRecord.FromDate;
_end=filteredRecord.ToDate;
while(filteredRecord.WriteComplete==false)
{
foreach(filteredRecords中的var记录)
{
如果(record.FromDate>\u开始和&record.FromDate<\u结束)\u结束=record.ToDate;
如果(record.ToDate<\u end&&record.ToDate>\u start)\u end=record.ToDate;
}
//Output0Buffer.AddRow();
//Output0Buffer.outSource=filteredRecord.Source;
//Output0Buffer.outNK=filteredRecord.Nk;
//Output0Buffer.outRecid=filteredRecord.Guid;
//Output0Buffer.outFromDate=\u开始;
//Output0Buffer.outToDate=\u end;
buffer.SetString(5,filteredRecord.Source);
缓冲设置字符串(6,filteredRecord.Nk);
SetGuid(7,filteredRecord.Guid);
buffer.SetDateTime(8,filteredRecord.FromDate);
buffer.SetDateTime(9,filteredRecord.ToDate);
_开始=_结束;
_end=filteredRecord.ToDate;
如果(\u start==\u end)filteredRecord.WriteComplete=true;
}
}
}
}
}
公开课记录
{
公共Guid Guid{get;set;}
公共字符串Nk{get;set;}
公共字符串源{get;set;}
公共日期时间FromDate{get;set;}
公共日期时间ToDate{get;set;}
公共bool WriteComplete{get;set;}
}
在我的ProcessArray方法中,我试图填充输出缓冲区。我甚至不确定这能不能做到

任何指导都将不胜感激


谢谢

是的,这种类型的转换是可以完成的,它被称为异步转换。我觉得你的代码不错。你的问题不清楚你是否遇到了特定的问题

您可能希望尝试并创建一个异步脚本组件转换,这样就不必摸索所有SSI管道

更多信息请点击此处:


我不确定我是否理解您试图实现的目标,但看起来您正在尝试对所有数据进行排序,然后依次处理排序后的列表。请注意,ProcessInput方法被调用多次,每次都有一个新的缓冲区。对接收到的缓冲区进行的任何排序仅适用于此特定缓冲区-数据不会全局排序,因此结果可能因缓冲区边界而异

对于特定场景,这可以吗?如果没有,请使用Sort transform对所有数据进行排序,在排序后添加您的转换,然后逐行处理数据-数据已经排序。所以只需逐行读取,然后在读取后修改当前的,这就是buffer.SetString的用途

另外,不要硬编码列索引,比如buffer.SetString(5,…)-数字可能会改变,最好在PreExecute中获取并保存列索引,然后使用
buffer.SetString(nkColumnIndex,nkColumnValue)

谢谢Jason,通过这些链接修复了我的组件。