Как сохранить значение столбца в переменную в Data Flow Task? - PullRequest
0 голосов
/ 22 января 2019

У меня есть DFT, где я извлекаю URL из таблицы, и мне нужно сохранить это значение в переменной.

Я использую источник OLEDB для подключения к My SQL Server и выбора необходимых столбцов.Тогда у меня есть условное разделение, которое разделит правильный URL для меня.Правильный поток URL из условного разбиения, который я сопоставил с компонентом скрипта.

Ниже приведен код C #, который я использовал:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    this.ReadWriteVariables["User::NextPageLink"].Value = Row.href;
}

Но когда я пытаюсь выполнить, я получаю нижеошибка:

[Компонент сценария [116]] Ошибка: Microsoft.SqlServer.Dts.Pipeline.ReadWriteVariablesNotAvailableException: коллекция переменных, заблокированных для доступа на чтение и запись, недоступна вне PostExecute.в Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException (исключение e) в Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput (Int32 inputID, буфер PipelineBuffer) в Microsoft.SqlServer.Dts.PipelineponTostMountMasterPowerManCHT, Int32 inputID, IDTSBuffer100 pDTSBuffer, IntPtr bufferWirePacket)

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Спасибо, @ userfl89. Я закодировал аналогично вашему, но я использовал VariableDispenser. Это действительно нужно здесь?

public override void PostExecute()
{
    base.PostExecute();
    VariableDispenser variableDispenser = (VariableDispenser)this.VariableDispenser;
    variableDispenser.LockForWrite("User::NextPageLink");
    this.ReadWriteVariables["User::NextPageLink"].Value = nextpagelink;

 }

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    nextpagelink = Row.href;
}
0 голосов
/ 22 января 2019

В компоненте скрипта переменные могут быть записаны только в методе PostExecute, в отличие от метода ProcessInputRow.Чтобы обновить переменную значением из столбца, объявите переменную вне этих методов, обновите переменную в ProcessInputRow и присвойте это значение переменной SSIS в методе PostExecute.И, конечно, добавьте переменную SSIS в поле ReadWriteVariables компонента Script.Как вы, возможно, знаете, метод ProcessInputRow вызывается один раз для каждой строки, тогда как PostExecute выполняется только после обработки всех записей, поэтому, если вам нужно что-то сделать со значениями из нескольких строк, вы захотите выполнитьэта логика в методе ProcessInputRow.Просто помните о дополнительных накладных расходах, связанных с выполнением любых действий, которые вы выполняете для каждой записи, проходящей через этот компонент.

string nextPageLink = null;

public override void PostExecute()
{
    base.PostExecute();
    Variables.NextPageLink = nextPageLink;  
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    nextPageLink = Row.href;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...