Создание выражения для переменной объекта? - PullRequest
0 голосов
/ 01 июля 2011

Я создаю пакет служб SSIS, и первым шагом является получение списка файлов, хранящихся в файле, и сохранение этой информации в переменной объекта.Я передаю эту переменную в задачу, которая пытается открыть список файлов.Однако задача открытия файла завершается неудачно, если нет файлов для открытия, поскольку папка пуста.

Я относительно новичок в использовании служб SSIS и мне было интересно узнать, как переписать выражение, которое проверяет, является ли переменная объектапусто и, если оно пусто, не позволяет запускать задачу открытия файла.

1 Ответ

4 голосов
/ 12 июля 2011

Вам не нужно использовать переменную объекта для циклического перемещения по файлам в папке. Вы можете легко достичь этого, используя Foreach Loop Container. Следующий пример демонстрирует, как это можно сделать. Пример был создан в SSIS 2008 R2.

Пошаговый процесс:

  1. Предположим, что нам нужно перебрать файлы по пути C: \ temp, как показано на скриншоте # 1 .

  2. В пакете служб SSIS создайте три переменные, а именно: FolderPath , FilePattern и FilePath . Смотрите скриншот # 2 . Установите переменную FolderPath для папки, через которую вы хотите выполнить цикл, в данном случае я выбрал C:\temp. Установите переменную FilePattern для шаблона, которому должны соответствовать ваши файлы, здесь я хотел бы просмотреть все файлы, чтобы я использовал *.*. Если вы хотите просмотреть только файлы Excel 2010, вы можете использовать *.xlsx. Он может принять только один шаблон. Не устанавливайте любое значение в переменную FilePath, так как оно будет назначено со значением, когда контейнер цикла по каждому элементу просматривает каждый файл в папке.

  3. На вкладке Control Flow пакета поместите Foreach Loop container, а затем поместите задачу Script в контейнер цикла Foreach. В этом примере мы собираемся просто пройтись по каждому файлу и отобразить их имена, а не делать больше ничего. Смотрите скриншот # 3 .

  4. Настройте контейнер цикла по каждому элементу, как показано на скриншотах # 4 и # 5 . В разделе Collection мы настроили выражения для использования переменных FolderPath и FilePattern. В разделе Отображения переменных мы указали контейнеру сохранять значение пути к файлу в переменной FilePath.

  5. Внутри задачи «Сценарий» замените код метода Main () на код, указанный в разделе Код задачи сценария . В коде нет ничего фантастического. Он просто отображает путь к файлу в окне сообщения.

  6. Снимки экрана # 6 - # 11 показывает пример выполнения пакета и прохождение каждого файла в папке. Обратите внимание на снимок экрана # 11 , задача скрипта помечена зеленым цветом, указывающим, что пакет успешно выполнил задачу.

  7. Теперь давайте удалим все файлы в папке C: \ temp, как показано на скриншоте # 12 .

  8. Если мы выполним пакет сейчас, задачи в контейнере цикла Foreach не будут выполняться, поскольку нет файлов для циклического прохождения и папка пуста. Смотрите скриншот # 13 . Обратите внимание, что задача скрипта помечена белым цветом, указывающим, что пакет не выполнил задачу скрипта и пропустил раздел.

  9. Это только простой пример. Вы можете сделать намного больше, чем просто отображать имена файлов. У вас могут быть другие задачи в контейнере цикла по каждому элементу, и для обработки файлов передайте переменную FilePath.

Надеюсь, это поможет.

Код задачи скрипта:

C # код, который можно использовать только в SSIS 2008 and above.

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForWrite("User::FilePath");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    MessageBox.Show(varCollection["User::FilePath"].Value.ToString(), "File Path");

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

Скриншот №1:

1

Скриншот № 2:

2

Скриншот № 3:

3

Снимок экрана № 4:

4

Скриншот № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Скриншот № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Скриншот № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...