【问题标题】:SSIS Data flow task runs by itself but not as part of packageSSIS 数据流任务自行运行,但不作为包的一部分
【发布时间】:2018-02-15 13:05:58
【问题描述】:

我有一个 dtsx 包,其中包含一堆数据流。

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

处理一些非常简单的 JSON 的最简单脚本之一可以完美地自行运行(右键单击 -> 执行任务,或者当所有其他任务被禁用时),但是当我尝试将包作为一个整体运行时,这个包因错误消息而跌倒

索引超出了数组的范围。 在 ScriptMain.Input0_ProcessInputRow(Input0Buffer 行) 在 UserComponent.Input0_ProcessInput(Input0Buffer 缓冲区) 在 UserComponent.ProcessInput(Int32 InputID,字符串 InputName,PipelineBuffer 缓冲区,OutputNameMap OutputMap) 在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponent.ProcessInput(Int32 InputID,PipelineBuffer 缓冲区) 在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, PipelineBuffer 缓冲区)

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。

请帮忙

谢谢

迈克

【问题讨论】:

    标签: c# json ssis


    【解决方案1】:

    如果您只是添加这两列,则不需要:

    //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 的那一列。

    【讨论】:

    • 谢谢 - 我将在稍后的解决方案中将这些列用于各种处理任务。运行的所有数据流也都有这些列。
    • 您不会丢失它们。他们未经任何编辑就通过了。
    【解决方案2】:

    最终这是由于将数据流任务从一个包复制到另一个包。我不是 100% 确定原因是什么,但复制并不完美,而且 DF 似乎正在相互感染。

    我在这里找到了解决方案

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

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2023-03-26
      • 1970-01-01
      • 2019-10-12
      • 2015-09-26
      • 2023-03-31
      • 2013-07-01
      • 2021-07-01
      • 1970-01-01
      相关资源
      最近更新 更多