2015-01-16 3 views
0

У меня есть задача скрипта внутри цикла foreach, который должен записываться в переменную.Запись в переменную SSIS изнутри цикла foreach

Выглядит хорошо, однако переменная никогда не кажется написана. Имя переменной написано правильно и задано как ReadWrite в конфигурации задачи сценария.

У переменной есть область видимости пакета, есть ли что-то связанное с тем, что она находится в цикле, который может повлиять на нее? Я также попытался использовать Dts.VariableDispencer.

Обновление: У меня есть int, что я также пишу рядом с тем, что написано в порядке. Помимо разных типов данных, метод идентичен. Любые идеи, почему я не могу написать строку?

+0

'Выглядит хорошо для меня, однако переменная никогда не кажется написана. '- Как вы это подтвердили? Нет причин, по которым переменная не будет записана, если она имеет область пакета. – SouravA

+0

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

+1

Вы уверены, что переменная даже настроена? Попробуйте добавить несколько функций 'MessageBox.Show()', чтобы узнать, установлено ли оно или нет. Кроме того, вы можете отлаживать пакет и видеть значение переменной, поскольку оно зацикливается в окне «Смотреть». – SouravA

ответ

0

Получается, что переменная была фактически установлена ​​как выражение (полностью забыл, что я это сделал!). Это было то, что мешало ему переписываться. Изменение его как обычной переменной позволило решить проблему.

+1

Haha..happens to the best of us! – SouravA

1

Используя этот tutorial, вы можете попробовать протестировать переменную, создав два метода: один для чтения переменной, а другой для записи в переменную. Прежде чем пытаться получить к нему доступ, вы должны заблокировать переменную. Подумайте об этом как о блокировке строк в SSIS. Вы хотите убедиться, что вы получаете самую точную версию переменной в тот момент времени. Какая польза вам, потому что все может работать параллельно, если другая задача обновляет переменную одновременно с тем, что вы пытаетесь ее прочитать?

public void Main() 
{ 
    string myVar = ReadVariable("myVar"); 
    MessageBox.Show(myVar, "myVar"); 
    WriteVariable("Variable", "Hello"); 
    string yourVar = ReadVariable("Variable"); 
    MessageBox.Show(yourVar, "yourVar"); 
    Dts.TaskResult = ScriptResults.Success; 
} 

private object ReadVariable(string varName) 
{ 
    object rtnValue = null; 
    //Create a variables collection to hold you object 
    Variables var = default(Variables); 

    try { 
     //Lock the variable first to make sure that you have exclusive access 
     //Think of it like a database object lock 
     Dts.VariableDispenser.LockOneForRead(varName, var); 

     //Now populate your result 
     rtnValue = var(varName).Value; 
    } catch (Exception ex) { 
     throw ex; 
    } finally { 
     //You must make sure that you unlock the variable before exiting routine 
     var.Unlock(); 
    } 

    return rtnValue; 
} 

private void WriteVariable(string varName, object value) 
{ 
    //Create a variables collection to hold you object 
    Variables var = default(Variables); 

    try { 
     //Lock the variable first to make sure that you have exclusive access 
     //Think of it like a database object lock 
     Dts.VariableDispenser.LockOneForWrite(varName, var); 

     //Now populate your result 
     var(varName).Value = value; 
    } catch (Exception ex) { 
     throw ex; 
    } finally { 
     //You must make sure that you unlock the variable before exiting routine 
     var.Unlock(); 
    } 

} 
Смежные вопросы