Нужно получить FileSize через пакетную задачу SSIS - PullRequest
1 голос
/ 14 июля 2011

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

SourceUri |SourceName |Направление |Дата |DOWNLOADCOUNT |FileSize

Я пытался получить размер файла через заголовки Uri, но он, похоже, не работает, есть ли задача, которую я мог бы добавить, чтобы получить размер файла для моего загруженного URI (у меня уже есть имя файлаа пункт назначения в переменных)?

Спасибо

Ответы [ 2 ]

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

Вы можете использовать System.IO.FileInfo, чтобы получить размер файла из SSIS Script Task. Следующий пример показывает, как этого можно достичь. Пример был создан в SSIS 2008 R2.

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

  1. В соединении пакета служб SSIS создайте соединение OLE DB для подключения к SQL Server, как показано на снимке экрана # 1 . Я назвал соединение как SQLServer .

  2. В базе данных SQL Server создайте таблицу с именем dbo.Downloads и заполните ее записями, используя сценарии, приведенные в разделе SQL Scripts . Снимок экрана # 2 показывает данные в таблице.

  3. В пакете служб SSIS создайте 8 переменных, как показано на скриншоте # 3 . Установите переменную LocalFolder со значением c:\temp\. Установите переменную SQLGetData со значением SELECT Id, SourceUri, SourceName FROM dbo.Downloads. Установите переменную SQLUpdate со значением UPDATE dbo.Downloads SET Destination = ?, Date = GETDATE(), DownloadCount = COALESCE(DownloadCount, 0) + 1, FileSize = ? WHERE Id = ?.

  4. На вкладке «Поток управления» пакета поместите задачу «Выполнить SQL», контейнер цикла Foreach и задачу «Сценарий и выполнить SQL» в контейнере цикла Foreach, как показано на снимке экрана # 4 .

  5. Настройте первую задачу «Выполнение SQL» с именем «Получить данные», как показано на снимках экрана # 5 и # 6 . Эта задача с извлечением записей и сохранением их в переменной Object.

  6. Настройте контейнер цикла по каждому элементу, как показано на скриншотах # 7 и # 8 . Эта задача будет проходить через набор результатов.

  7. Замените метод Main () в задаче сценария на код, указанный в разделе Код задачи сценария . Код использует объект System.IO.FileInfo для получения размера файла после его загрузки.

  8. Настройте вторую задачу «Выполнение SQL» с именем «Обновление», как показано на снимках экрана # 9 и # 10 . Эта задача обновит базу данных после загрузки файла.

  9. Снимок экрана # 11 показывает, что путь к папке C:\temp\ пуст до выполнения пакета.

  10. Снимок экрана # 12 показывает выполнение пакета.

  11. Снимок экрана # 13 показывает, что путь к папке C:\temp\ содержит загруженное содержимое после выполнения пакета.

  12. Снимок экрана # 14 показывает данные в таблице dbo. Загружается после выполнения пакета. Снимки экрана # 15 и # 16 показывают свойства загруженных файлов. Обратите внимание, что размер файла обновляется в таблице вместе с размером файла в диалоговом окне свойств. NOTE: System.IO.File будет извлекать только размер, а не Размер на диске. Размер файла, обновляемый в таблице базы данных, составляет байт .

  13. Снимок экрана # 17 показывает, что путь к папке C:\temp\ содержит загруженное содержимое после второго выполнения пакета . Обратите внимание на значение DownloadCount .

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

Сценарии SQL:

CREATE TABLE [dbo].[Downloads](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [SourceUri] [varchar](255) NOT NULL,
    [SourceName] [varchar](255) NOT NULL,
    [Destination] [varchar](255) NULL,
    [Date] [datetime] NULL,
    [DownloadCount] [int] NULL,
    [FileSize] [int] NULL,
 CONSTRAINT [PK_Downloads] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

INSERT INTO dbo.Downloads (SourceUri, SourceName) VALUES
('http://www.google.com/intl/en_com/images/srpr/', 'logo1w.png'),
('http://upload.wikimedia.org/wikipedia/commons/6/63/', 'Wikipedia-logo.png');
GO

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

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

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::SourceUri");
    Dts.VariableDispenser.LockForRead("User::SourceName");
    Dts.VariableDispenser.LockForRead("User::LocalFolder");
    Dts.VariableDispenser.LockForWrite("User::Destination");
    Dts.VariableDispenser.LockForWrite("User::FileSize");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    System.Net.WebClient myWebClient = new System.Net.WebClient();
    string sourceUri = varCollection["User::SourceUri"].Value.ToString();
    string sourceName = varCollection["User::SourceName"].Value.ToString();
    string webResource = sourceUri + sourceName;
    string fileName = varCollection["User::LocalFolder"].Value.ToString() + sourceName;
    myWebClient.DownloadFile(webResource, fileName);

    System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);
    varCollection["User::Destination"].Value = fileName;
    varCollection["User::FileSize"].Value = Convert.ToInt32(fileInfo.Length);

    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

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

14

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

15

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

16

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

17

1 голос
/ 15 июля 2011

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

...