SSIS Задача потока данных выполняется сама по себе, но не как часть пакета

У меня есть пакет dtsx, который содержит кучу потоков данных.

Все они выбирают строки из таблицы, каждая из строк содержит столбец с некоторым JSON, есть компонент сценария (C#), который десериализует JSON, а затем место назначения данных, которое загружает данные в некоторые буферные таблицы.

Один из самых простых сценариев, который имеет дело с каким-то действительно простым JSON, прекрасно работает сам (Правый клик -> Выполнить задачу или когда все другие задачи отключены), однако, когда я пытаюсь запустить пакет в целом, этот пакет падает с сообщение об ошибке

Индекс находился вне границ массива. на ScriptMain.Input0_ProcessInputRow(Input0Buffer Row) в 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 одновременно.

Пожалуйста помоги

Спасибо

Майк

2 ответа

Если вы просто добавляете эти два столбца, то вам не нужно:

//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 на средней странице.

В конечном итоге это было связано с копированием задач потока данных из одного пакета в другой. Я не уверен на 100%, в чем причина, но копирование не было идеальным, и ДФ, похоже, заражали друг друга.

Я нашел решение здесь

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

Другие вопросы по тегам