我有一个在 BIDS 中构建的 SSIS 包。目前,我的控制流从表中拉出一个 Uri 和文件夹目的地,将 Uri 下载到给定的目的地。我想做的是用文件大小更新该表。源表如下所示:
SourceUri | 来源名称 | 目的地 | 日期 | 下载计数| 文件大小
我试图通过 Uri 标头获取文件大小,但它似乎不起作用,是否可以添加一个任务来获取我下载的 uri 的文件大小(我已经有了文件名和变量中的目标)?
谢谢
小智 5
您可以利用System.IO.FileInfo来从 SSIS 中获取文件大小Script Task。以下示例显示了如何实现这一点。该示例是在SSIS 2008 R2.
分步过程:
在 SSIS 包的连接上创建一个 OLE DB 连接以连接到 SQL Server,如屏幕截图 # 1所示。我已将该连接命名为SQLServer。
在 SQL Server 数据库中,dbo.Downloads使用SQL 脚本部分下给出的脚本创建一个名为并填充记录的表。屏幕截图 # 2显示了表中的数据。
在 SSIS 包上,创建 8 个变量,如屏幕截图 # 3所示。将变量LocalFolder设置为value c:\temp\。将变量SQLGetData设置为value SELECT Id, SourceUri, SourceName FROM dbo.Downloads。将变量SQLUpdate设置为value UPDATE dbo.Downloads SET Destination = ?, Date = GETDATE(), DownloadCount = COALESCE(DownloadCount, 0) + 1, FileSize = ? WHERE Id = ?。
在包的控制流选项卡上,将执行 SQL 任务、Foreach 循环容器和脚本任务和执行 SQL 任务放置在 Foreach 循环容器中,如屏幕截图 # 4所示。
配置名为“获取数据”的第一个执行 SQL 任务,如屏幕截图 # 5和 # 6 所示。此任务获取记录并将其存储在 Object 变量中。
配置 Foreach 循环容器,如屏幕截图 # 7和 # 8 所示。此任务将循环遍历结果集。
将脚本任务中的 Main() 方法替换为脚本任务代码部分下提供的代码。该代码使用该System.IO.FileInfo对象在下载后获取文件大小。
配置名为“更新”的第二个执行 SQL 任务,如屏幕截图 # 9和 # 10 所示。此任务将在文件下载后更新数据库。
屏幕截图 # 11显示在包执行之前文件夹路径C:\temp\为空。
屏幕截图 # 12显示了包执行。
屏幕截图 # 13显示文件夹路径C:\temp\包含包执行后下载的内容。
屏幕截图 # 14显示了包执行后表 dbo.Downloads 中的数据。屏幕截图 # 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
Run Code Online (Sandbox Code Playgroud)
脚本任务代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
截图 #1:

截图#2:

截图 #3:

截图 #4:

截图 #5:

截图 #6:

截图 #7:

截图 #8:

截图 #9:

截图 #10:

截图 #11:

截图 #12:

截图 #13:

截图 #14:

截图 #15:

截图 #16:

截图 #17:
