Вы можете использовать System.IO.FileInfo
, чтобы получить размер файла из SSIS Script Task
. Следующий пример показывает, как этого можно достичь. Пример был создан в SSIS 2008 R2
.
Пошаговый процесс:
В соединении пакета служб SSIS создайте соединение OLE DB для подключения к SQL Server, как показано на снимке экрана # 1 . Я назвал соединение как SQLServer .
В базе данных SQL Server создайте таблицу с именем dbo.Downloads
и заполните ее записями, используя сценарии, приведенные в разделе SQL Scripts . Снимок экрана # 2 показывает данные в таблице.
В пакете служб 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 = ?
.
На вкладке «Поток управления» пакета поместите задачу «Выполнить SQL», контейнер цикла Foreach и задачу «Сценарий и выполнить SQL» в контейнере цикла Foreach, как показано на снимке экрана # 4 .
Настройте первую задачу «Выполнение SQL» с именем «Получить данные», как показано на снимках экрана # 5 и # 6 . Эта задача с извлечением записей и сохранением их в переменной Object.
Настройте контейнер цикла по каждому элементу, как показано на скриншотах # 7 и # 8 . Эта задача будет проходить через набор результатов.
Замените метод Main () в задаче сценария на код, указанный в разделе Код задачи сценария . Код использует объект System.IO.FileInfo
для получения размера файла после его загрузки.
Настройте вторую задачу «Выполнение SQL» с именем «Обновление», как показано на снимках экрана # 9 и # 10 . Эта задача обновит базу данных после загрузки файла.
Снимок экрана # 11 показывает, что путь к папке C:\temp\
пуст до выполнения пакета.
Снимок экрана # 12 показывает выполнение пакета.
Снимок экрана # 13 показывает, что путь к папке C:\temp\
содержит загруженное содержимое после выполнения пакета.
Снимок экрана # 14 показывает данные в таблице dbo. Загружается после выполнения пакета. Снимки экрана # 15 и # 16 показывают свойства загруженных файлов. Обратите внимание, что размер файла обновляется в таблице вместе с размером файла в диалоговом окне свойств. NOTE
: System.IO.File будет извлекать только размер, а не Размер на диске. Размер файла, обновляемый в таблице базы данных, составляет байт .
Снимок экрана # 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:
Скриншот № 2:
Снимок экрана № 3:
Снимок экрана № 4:
Снимок экрана № 5:
Снимок экрана № 6:
Снимок экрана № 7:
Снимок экрана № 8:
Снимок экрана № 9:
Снимок экрана № 10:
Скриншот № 11:
Снимок экрана № 12:
Снимок экрана № 13:
Снимок экрана № 14:
Снимок экрана № 15:
Снимок экрана № 16:
Снимок экрана № 17: