在 SSIS 脚本任务中引用 DLL





5.00/5 (3投票s)
在 SSIS 脚本任务中引用并编写您自己的业务逻辑(使用 C#)并将其添加进去。
引言
SQL Server 2012 为在 SSIS 脚本任务中添加您喜欢的语言并实现业务逻辑提供了支持。本文介绍了如何将您自己的类库引用到脚本任务中。
概述
让我们从脚本任务开始。脚本任务是一种扩展 SSIS 功能的方式,当内置组件无法满足您的需求时,您可以使用脚本任务编写自己的自定义代码并与内置组件集成。
大多数人会在脚本任务中进行变量操作,有些甚至会执行业务任务。有时我们会遇到这种情况:需要将数据集变量映射到自定义类,并在另一个脚本任务中引用它。更好的解决方案是创建一个包含类定义的自己的库,并在解决方案中引用它。
下面是添加引用以及我如何使用它的步骤。
创建您自己的 SSIS 辅助类库
1) 首先,我们需要创建一个将在 SSIS 包中引用的辅助项目。打开 Visual Studio 2013 并选择“类库”。
2) 添加一个新类 **StudentDetails.cs**
将以下代码块添加到类中。
public class StudentDetails { public int Id { get; set; } public string Name { get; set; } }
3) **为程序集进行强命名**
在将此 DLL 添加为引用之前,我们需要**为程序集进行强命名**。为此,请打开“*Visual Studio Command Prompt (2010)*”,浏览到您的类库项目文件夹,然后执行以下命令来创建密钥。
sn.exe -k PublicPrivateKeyFile.snk
4) 将生成的密钥文件添加到项目中,并在 AssemblyInfo 文件中进行指定。
要将 **snk** 文件添加到项目文件,请右键单击项目文件,选择“*添加”*、“*现有项”*,然后单击“确定”将文件添加到解决方案。
SSISHelper->Right Click ->Add-> Existing item -> select the snk file.
编辑 AssemblyInfo.cs 文件并指定密钥文件。
[assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("PublicPrivateKeyFile.snk")]
5) 将项目 DLL 添加到 GAC
由于 SSIS 只引用 GAC 中的 DLL,因此请以发布模式构建解决方案并将 DLL 添加到 GAC。请按照以下命令执行添加操作。
gacutil -i C:\Users\rmadamba\Desktop\SSIS\SSISHelper.dll
现在您已将 DLL 添加到 GAC,您可以在 SSIS 脚本任务中引用它。接下来是创建一个 SSIS 包并添加脚本任务来引用 DLL。
6) 在您的 Visual Studio 中创建一个 SSIS 项目。
在这里,我们创建一个 SSIS 包,在该包中我们将生成带有 ID 和姓名的学生。为此,创建一个 Object 类型的包变量来保存学生详细信息(在此情况下将是一个学生数组),以及一个脚本任务,用于将学生详细信息添加到变量集合中。
接下来,我们将逐个循环遍历所有学生,并将他们添加到目标表中。为了在 foreach 容器内逐个添加学生详细信息,我们需要一个脚本任务,该脚本任务会将当前学生详细信息强制转换为单独的变量。
将变量添加到包
添加新的 StudentDetails 变量到包。
此变量将用于在脚本任务中存储学生集合。
添加脚本任务
将脚本任务拖放到占位符上,然后打开它以编辑脚本。为项目添加 SSISHelper DLL 引用。
在 *ReadWriteVariables* 中指定变量将允许脚本读取和修改值。
接下来,单击 **Edit Script** 以打开脚本窗口。将 SSISHelper DLL 添加到引用中。
将以下代码添加到您的脚本中。
public void Main() { ArrayList studentCollection = new ArrayList(); SSISHelper.StudentDetails student; // Generate student id and name and add to the ArrayList for (int i = 1; i < 11; i++) { student = new SSISHelper.StudentDetails(); student.Id = i; student.Name = "No name" + i; studentCollection.Add(student); } Dts.Variables["User::StudentDetails"].Value = studentCollection; Dts.TaskResult = (int)ScriptResults.Success; }
添加 ForeachLoopContainer
添加一个 foreach 循环容器,并将其连接为脚本任务之后的下一个任务。这将逐个循环遍历每个学生并将其插入数据库。
将枚举类型选择为 **Foreach From Variable Enumerator**,因为我们正在循环的变量是 IEnumerable 类型。
创建一个新变量来在迭代时保存学生详细信息,并将其映射到 foreach 中的变量。
在 foreach 循环容器内创建一个 Script task
在 foreach 容器内创建另一个脚本任务。在这里,我们将更新每个学生姓名,并将其分配给另外两个变量。这些变量将用作插入存储过程的参数。
为脚本任务设置变量。在这里,我们创建了两个新变量来保存学生 ID 和学生姓名。这些将用作数据插入的参数。
完成此操作后,设置脚本任务的“脚本变量”。在这里,只读变量将是循环对象“user::Student”,读写变量将是“user::Id”、“user::Name”。
打开脚本进行编辑,并引用相同的 SSISHelper DLL,然后添加以下代码片段。
public void Main() { SSISHelper.StudentDetails std = (SSISHelper.StudentDetails)Dts.Variables["User::Student"].Value; // Assign the id and name to the variables. Dts.Variables["User::Id"].Value = std.Id; Dts.Variables["User::Name"].Value = std.Name + "Updated"; Dts.TaskResult = (int)ScriptResults.Success; }
接下来,我们将结果存储到数据库。为此,我们将添加一个 **Execute Sql Task** 并指定接受“User::Id”、“User::Name”作为参数的存储过程。此过程会将参数结果插入目标数据库。
在参数字段中指定变量。
完成此设置后,设置数据库连接并指定接受参数的存储过程。运行 SSIS 包将为您提供结果。
关注点
上述示例仅用于解释。在脚本任务中,您可以添加自己的业务逻辑来执行。但请注意,从脚本任务执行数据库操作会降低性能,不如使用 SSIS 组件。