需要通过SSIS包任务获取FileSize

时间:2011-07-14 18:53:21

标签: ssis filesize

我有一个在BIDS中构建的SSIS包。目前,我的控制流将Uri和文件夹目标从表中拉出,将Uri下载到给定目标。我想要做的是用filesize更新该表。源表看起来像这样:

SourceUri | SourceName |目的地|日期| DownloadCount | FileSize

我试图通过Uri Headers获取文件大小但它似乎不起作用,是否有一个我可以添加的任务将获取我下载的uri的文件大小(我已经有文件名和目的地变量)?

由于

2 个答案:

答案 0 :(得分:4)

您可以使用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 所示。使用值c:\temp\设置变量 LocalFolder 。使用值SELECT Id, SourceUri, SourceName FROM dbo.Downloads设置变量 SQLGetData 。使用值UPDATE dbo.Downloads SET Destination = ?, Date = GETDATE(), DownloadCount = COALESCE(DownloadCount, 0) + 1, FileSize = ? WHERE Id = ?设置变量 SQLUpdate

  4. 在包的控制流选项卡上,放置一个执行SQL任务,一个Foreach循环容器和一个脚本任务&在Foreach循环容器中执行SQL任务,如屏幕截图# 4 所示。

  5. 配置名为“获取数据”的第一个执行SQL任务,如屏幕截图# 5 和# 6 所示。此任务用于获取记录并将其存储在Object变量中。

  6. 配置Foreach循环容器,如屏幕截图# 7 和# 8 所示。此任务将遍历结果集。

  7. 使用脚本任务代码部分下提供的代码替换脚本任务中的Main()方法。代码使用System.IO.FileInfo对象在下载后获取文件大小。

  8. 配置名为“Update”的第二个执行SQL任务,如屏幕截图# 9 和# 10 所示。此任务将在文件下载后更新数据库。

  9. 屏幕截图# 11 显示文件夹路径C:\temp\在包执行之前为空

  10. 屏幕截图# 12 显示包执行。

  11. 屏幕截图# 13 显示文件夹路径C:\temp\包含强大的

  12. 后的内容

  13. 屏幕截图# 14 在包执行后显示表dbo.Downloads中的数据。屏幕截图# 15 和# 16 显示下载文件的属性。请注意表格中更新的文件大小以及属性对话框中的文件大小。 NOTE :System.IO.File将仅提取磁盘上的大小和大小。数据库表中更新的文件大小为 bytes

  14. 屏幕截图# 17 表示文件夹路径C:\temp\包含 第二个包执行后的下载内容。请注意 DownloadCount 值。

  15. 希望有所帮助。

    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 :(得分:1)

下载文件后,您可以使用脚本任务使用标准.NET FileInfo类获取所需的文件大小或任何其他信息,并将其保存到包变量中。