65.9K
CodeProject 正在变化。 阅读更多。
Home

在 SSIS 脚本任务中引用 DLL

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2015年4月10日

CPOL

4分钟阅读

viewsIcon

64437

在 SSIS 脚本任务中引用并编写您自己的业务逻辑(使用 C#)并将其添加进去。

引言

SQL Server 2012 为在 SSIS 脚本任务中添加您喜欢的语言并实现业务逻辑提供了支持。本文介绍了如何将您自己的类库引用到脚本任务中。

概述

让我们从脚本任务开始。脚本任务是一种扩展 SSIS 功能的方式,当内置组件无法满足您的需求时,您可以使用脚本任务编写自己的自定义代码并与内置组件集成。

大多数人会在脚本任务中进行变量操作,有些甚至会执行业务任务。有时我们会遇到这种情况:需要将数据集变量映射到自定义类,并在另一个脚本任务中引用它。更好的解决方案是创建一个包含类定义的自己的库,并在解决方案中引用它。

下面是添加引用以及我如何使用它的步骤。

创建您自己的 SSIS 辅助类库

1) 首先,我们需要创建一个将在 SSIS 包中引用的辅助项目。打开 Visual Studio 2013 并选择“类库”。

Creating class lib project

 

 

 

 

 

 

 

 

 

 

 

 

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* 中指定变量将允许脚本读取和修改值。


Specify the variable to allow the script to add values

接下来,单击 **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 类型。

Setting Enumeration type

创建一个新变量来在迭代时保存学生详细信息,并将其映射到 foreach 中的变量。

looping variable

在 foreach 循环容器内创建一个 Script task

在 foreach 容器内创建另一个脚本任务。在这里,我们将更新每个学生姓名,并将其分配给另外两个变量。这些变量将用作插入存储过程的参数。

为脚本任务设置变量。在这里,我们创建了两个新变量来保存学生 ID 和学生姓名。这些将用作数据插入的参数。

学生 ID 和姓名变量完成此操作后,设置脚本任务的“脚本变量”。在这里,只读变量将是循环对象“user::Student”,读写变量将是“user::Id”、“user::Name”。

Setting script task variables

打开脚本进行编辑,并引用相同的 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”作为参数的存储过程。此过程会将参数结果插入目标数据库。

在参数字段中指定变量。

EST parameter mapping

完成此设置后,设置数据库连接并指定接受参数的存储过程。运行 SSIS 包将为您提供结果。

Final result

关注点

上述示例仅用于解释。在脚本任务中,您可以添加自己的业务逻辑来执行。但请注意,从脚本任务执行数据库操作会降低性能,不如使用 SSIS 组件。

© . All rights reserved.