我有一个在BIDS中构建的SSIS包。目前,我的控制流将Uri和文件夹目标从表中拉出,将Uri下载到给定目标。我想要做的是用filesize更新该表。源表看起来像这样:
SourceUri | SourceName |目的地|日期| DownloadCount | FileSize
我试图通过Uri Headers获取文件大小但它似乎不起作用,是否有一个我可以添加的任务将获取我下载的uri的文件大小(我已经有文件名和目的地变量)?
由于
答案 0 :(得分:4)
您可以使用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 所示。使用值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 。
在包的控制流选项卡上,放置一个执行SQL任务,一个Foreach循环容器和一个脚本任务&在Foreach循环容器中执行SQL任务,如屏幕截图# 4 所示。
配置名为“获取数据”的第一个执行SQL任务,如屏幕截图# 5 和# 6 所示。此任务用于获取记录并将其存储在Object变量中。
配置Foreach循环容器,如屏幕截图# 7 和# 8 所示。此任务将遍历结果集。
使用脚本任务代码部分下提供的代码替换脚本任务中的Main()方法。代码使用System.IO.FileInfo
对象在下载后获取文件大小。
配置名为“Update”的第二个执行SQL任务,如屏幕截图# 9 和# 10 所示。此任务将在文件下载后更新数据库。
屏幕截图# 11 显示文件夹路径C:\temp\
在包执行之前为空。
屏幕截图# 12 显示包执行。
屏幕截图# 13 显示文件夹路径C:\temp\
包含>强大的
屏幕截图# 14 在包执行后显示表dbo.Downloads中的数据。屏幕截图# 15 和# 16 显示下载文件的属性。请注意表格中更新的文件大小以及属性对话框中的文件大小。 NOTE
:System.IO.File将仅提取磁盘上的大小和不大小。数据库表中更新的文件大小为 bytes 。
屏幕截图# 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:
答案 1 :(得分:1)
下载文件后,您可以使用脚本任务使用标准.NET FileInfo类获取所需的文件大小或任何其他信息,并将其保存到包变量中。