SSIS: захват [FileCreationDate] и [FileSize] файлов .csv в отдельных пользовательских переменных внутри контейнера ForEachLoop с использованием задачи сценария (C #) в CFlow - PullRequest
0 голосов
/ 05 января 2019

У меня хороший опыт работы с SSIS, но ноль в том, что касается Script Task и Script Component.

У меня есть ситуация, когда я загружаю много CSV-файлов в таблицу назначения SQL Server. Я использую контейнер For Every Loop.

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

Я загружаю некоторые из этих переменных в таблицу Audit Tracker, используя задачу «Выполнение SQL» в потоке управления, после задачи «Поток данных» (все внутри контейнера «Для каждого цикла»)

До этого момента все в порядке.

Теперь наш клиент хочет захватить FileCreationDate (т.е. изменена дата) и FileSize каждого из этих файлов .csv. Мне нужно захватить их в отдельных пользовательских переменных.

Очевидно, что мне нужна помощь, потому что это не может быть сделано без некоторых сценариев.

В потоке управления внутри контейнера ForEachLoop я добавил задачу ScriptTask сразу после задачи потока данных.

У меня в пакете следующие три пользовательские переменные:

1) User :: Filename (строковая переменная для каждого файла .csv; это нормально, без проблем)

2) User :: FileCreatedDateTime (переменная для записи даты создания каждого файла .csv; пожалуйста, дайте мне знать, будет ли тип данных DateTime в порядке)

3) User :: FileSize (переменная для записи размера каждого файла .csv; дайте мне знать, будет ли тип данных строки нормальным)

Теперь, кто-нибудь может дать мне знать следующие настройки в Редакторе задач скрипта ?

Вкладка «Сценарий» :

Язык как Microsoft Visual C # 2017 (отключен)

Точка входа: Главная (это правильно?)

ReadOnlyVariables: (Что я должен установить?)

ReadWriteVariables: (Что я должен установить?)

Вкладка «Выражения»:

Какие выражения я должен задать? т.е. собственность и выражение.

Редактировать сценарий:

Какой код я должен набрать? Я ссылался на эти два сайта, но не смог получить правильный код

http://www.techbrothersit.com/2011/02/ssis-load-files-information-to-sql.html

SSIS Чтение даты изменения файла

Может кто-нибудь дать мне четкий код и прояснить другие сомнения?

Ответы [ 2 ]

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

Все эти компоненты легко объяснены в Google. На самом деле, я сейчас иду через Google, чтобы освежить свою память и написать этот наполовину испеченный ответ.

Пожалуйста, пройдите это, отладьте мой код и опубликуйте правильный код, когда он заработает. Это вряд ли сработает с первой попытки, и вам нужно будет отладить, но вы узнаете больше, если действительно отладите его.

Вкладка «Сценарий»:

Язык как Microsoft Visual C # 2017 (отключен)

Я предлагаю вам использовать C #, а не VB, так как есть другие примеры онлайн для C #. Так что оставь как есть

Точка входа: Главная (это правильно?)

Это просто обозначает имя функции, которая будет автоматически вызываться в рамках задачи скрипта ... которая в шаблоне равна Main, поэтому оставьте как есть

ReadOnlyVariables: (Что я должен установить?)

Это переменные, которые ваша задача скрипта должна прочитать (но не записать обратно). Так что это должно иметь User::Filename в нем. Используйте пользовательский интерфейс, чтобы заполнить его.

ReadWriteVariables: (Что я должен установить?)

Это переменные, которые ваша задача скрипта должна прочитать и записать обратно. Так что в нем должно быть что-то вроде User::FileCreatedDateTime,User::FileSize. Используйте пользовательский интерфейс, чтобы заполнить его.

Теперь, когда вы нажмете кнопку Edit Script.., вы получите шаблонный скрипт.

Примечание

  • В нем уже есть метод Main
  • В комментариях содержатся подробные инструкции о том, как читать и записывать переменные

(это адаптировано отсюда и, вероятно, не работает без отладки http://www.techbrothersit.com/2011/02/ssis-load-files-information-to-sql.html)

Откройте область пространств имен и добавьте System.IO:

.
#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
#endregion

Перейдите к основному методу внизу и отредактируйте его:

public void main()
{

// Get the file path from the SSIS variable
string FilePath = Dts.Variables["User::Filename"].Value.ToString();

// Use the FileInfo method from System.IO to get the file object
FileInfo file = new FileInfo(FilePath);

// Save file properties back to SSIS variables
Dts.Variables["User::FileCreatedDateTime"].Value = file.CreationTime;
Dts.Variables["User::FileSize"].Value = file.Length;

// Return success
Dts.TaskResult = (int)ScriptResults.Success;
}

Я отмечаю, что этот код очень похож на вторую ссылку, которую вы опубликовали - если у вас возникли проблемы с примером кода, вам нужно объяснить, почему (то есть конкретное сообщение об ошибке)

Вы могли бы также иметь трещину в этом пользовательском компоненте https://archive.codeplex.com/?p=filepropertiestask, но я настоятельно рекомендую никогда не использовать пользовательские компоненты в ваших пакетах служб SSIS, поскольку они, как правило, доставляют массу хлопот.

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

Добавить Using System.IO; пространство имен

Для создания файлаDate

DateTime creation_time = File.GetCreationTime(@"C:\test.txt");

Получить размер файла

 long filesize = File.Length; 

записать обе переменные в выходную переменную.

...