SSIS数据流任务单独运行,但不作为程序包的一部分运行

时间:2018-02-15 13:05:58

标签: c# json ssis

我有一个包含大量数据流的dtsx包。

所有这些行都从表中选择行,每行包含一个带有一些JSON的列,有一个脚本组件(C#)反序列化JSON,然后是一个数据目标,它将数据加载到某些缓冲表。 / p>

一个最简单的脚本处理一些非常简单的JSON单独运行(右键单击 - >执行任务,或者当所有其他任务都被禁用时),但是当我尝试运行整个包时包失败并显示错误消息

索引超出了数组的范围。    在ScriptMain.Input0_ProcessInputRow(Input0Buffer Row)    在UserComponent.Input0_ProcessInput(Input0Buffer Buffer)    at UserComponent.ProcessInput(Int32 InputID,String InputName,PipelineBuffer Buffer,OutputNameMap OutputMap)    在Microsoft.SqlServer.Dts.Pipeline.ScriptComponent.ProcessInput(Int32 InputID,PipelineBuffer buffer)    在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID,PipelineBuffer buffer)

JSON看起来像这样......

{
"token": "0b683877-81d6-4dhs-a1ad-9fcfff6acb61",
"email": "someone@gmail.com"
}

和c#这样

public class RootAttributes
{
    public string token { get; set; }
    public string email { get; set; }
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    String myEvtData = System.Text.Encoding.Unicode.GetString(Row.evtdata.GetBlobData(0, Convert.ToInt32(Row.evtdata.Length)));
    JavaScriptSerializer js = new JavaScriptSerializer();
    RootAttributes jRow = js.Deserialize<RootAttributes>(myEvtData);

    //DB Output
    Output0Buffer.AddRow();
    Output0Buffer.country = Row.country;
    Output0Buffer.ord = Row.ord;
    Output0Buffer.aggregateversion = Row.aggregateversion;
    Output0Buffer.clienttype = Row.clienttype;
    Output0Buffer.aggregateid = Row.aggregateid;
    Output0Buffer.updby = Row.updby;
    Output0Buffer.evttimestamp = Row.evttimestamp;
    //JSON Output
    Output0Buffer.token = jRow.token;
    Output0Buffer.email = jRow.email;
}

我有第二个脚本 - 几乎完全相同但也失败并出现相同的错误消息。我已经尝试过一个接一个地独立运行它们 - 即所有DF一次运行。

请帮忙

由于

麦克

2 个答案:

答案 0 :(得分:0)

如果您只是添加这两列,那么您就不需要:

//DB Output
    Output0Buffer.AddRow();
    Output0Buffer.country = Row.country;
    Output0Buffer.ord = Row.ord;
    Output0Buffer.aggregateversion = Row.aggregateversion;
    Output0Buffer.clienttype = Row.clienttype;
    Output0Buffer.aggregateid = Row.aggregateid;
    Output0Buffer.updby = Row.updby;
    Output0Buffer.evttimestamp = Row.evttimestamp;

只需将两列添加到Output0Buffer。

您只需要检查中间页面上有一个JSON的列。

答案 1 :(得分:0)

最终,这是因为将数据流任务从一个包复制到另一个包。我不是百分之百确定原因是什么,但复制并不完美,DF似乎互相感染。

我在这里找到了解决方案

https://kohera.be/blog/sql-server/the-dangers-of-copying-script-components-in-ssis/