2014-01-04 2 views
1

Я создаю пакет SSIS, где мне нужно перебирать некоторые из выбранной папки, и я хочу сохранить имена папок в массиве, чтобы отслеживать папки, которые я обработано. Могу ли я хранить массив в пакете SSIS и продолжать добавлять значение в этот массив?SSIS-пакет: сохранить значение переменной цикла для цикла в массиве

+1

Да, но, возможно, вы могли бы лучше объяснить, что вы делаете. Существуют встроенные средства для перечисления в папке и отслеживания посещаемости, поэтому я беспокоюсь о том, что вы изобретаете колесо. – billinkc

+0

Большое спасибо за ваш ответ. Поэтому я стараюсь сделать следующие шаги: 1. получение файлов и их перемещение в соответствующую папку даты в соответствии с именем файла 2. Поскольку существует много существующих ранее папок с датами, поэтому мне нужно отслеживать папку с датой, в которой я перемещаю файл для дальнейшей обработки. 3. Теперь мне нужно запустить инструмент только в тех папках, где я переместил файл. Мое первоначальное предположение состояло в том, чтобы сохранить объект SSIS и добавить имя папки даты при итерации через цикл for for, но я не могу добавить несколько строк в пакет SSIS в виде массива. –

+0

Если вы на самом деле не делаете никаких манипуляций с данными, я бы предложил сделать это в автономном скрипте вместо SSIS –

ответ

4

Вы можете сохранить значение переменной цикла for в массиве. Это немного грязная ИМО. Вероятно, существует более чистый подход с использованием функциональности SSIS «из коробки», предлагаемой @billinkc. Однако, вот некоторые указатели ...

Пойдем со своим сценарием, где у вас есть для каждого цикла, который выполняет итерацию по некоторым файлам (с использованием Foreach File Enumerator), и вы хотите сохранить имена папок в массиве.

Вот некоторые переменные, которые мы будем использовать:

enter image description here

FolderList будет массив и CurrentFile будет для переменной цикла. Пакет в своей простейшей форме может выглядеть следующим образом:

enter image description here

В задаче сценария, код может выглядеть следующим образом. Я решил использовать List<string> как мой тип массива, но вы могли бы использовать что-то еще, например ArrayList. (Примечание: вам нужно добавить, используя операторы для System.Collections.Generic и System.IO для кода ниже):

public void Main() 
{ 
    //get current directory 
    string directory = Path.GetDirectoryName(Dts.Variables["User::CurrentFile"].Value.ToString()); 
    List<string> lst = new List<string>(); 

    // if the FolderList is already a List<string> then set set it to lst 
    if ((Dts.Variables["User::FolderList"].Value is List<string>)) 
    { 
     lst = (List<string>)Dts.Variables["User::FolderList"].Value; 
    }   

    // if the directory isn't in the list yet, then add it to the list 
    if(!lst.Contains(directory)) 
    { 
     lst.Add(directory); 
    } 

    // update our variable with the List<string> 
    Dts.Variables["User::FolderList"].Value = lst; 

    Dts.TaskResult = (int)ScriptResults.Success; 
} 

Каждый раз, когда Script Task выполняется, вы получите новую папку добавляется в массив. После выполнения каждого цикла вы можете проверить значения массива. Вы можете сделать это с помощью Script Task (подобно тому, что мы делали выше):

List<string> lst = (List<string>)Dts.Variables["User::FolderList"].Value; 
// do stuff with lst 

Вы также можете перебирать значения в массиве, используя для каждого цикла (используйте Foreach From Variable Enumerator), который я только что узнал, как я шел через это (спасибо!). Просто установите переменную для перечисления на вашу переменную массива (здесь FolderList) и укажите другую переменную (например, CurrentFolder) как индекс 0 в переменных. Это работало для List<string>, но я не уверен, с какими другими типами коллекций он будет работать.

+0

Спасибо большое, что было полезно ... Я хочу дать +1, но я только начал с переполнения стека !! Спасибо anyways –

+0

Спасибо .. это было полезно –

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