我有一个包含大量数据流的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一次运行。
请帮忙
由于
麦克
答案 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/