如何在SSIS的脚本组件中访问变量

原文:如何在SSIS的脚本组件中访问变量

这是一个小问题,我们在SSIS的设计中很多地方都会用到变量,我习惯性地将“变量”和“表达式”称为SSIS的灵魂,虽然不见得绝对准确,但它们确实是保证一个SSIS包灵活性的根本。

同时,我们可能也会在数据流任务中添加“脚本组件”,用我们熟知的C#或者VB.NET编写一些数据转换处理的逻辑。这里可能就有一个需求,我们希望在脚本组件中访问变量(读或者写),但默认情况下,这个需求并不是那么容易实现。我们来看下面的例子

 

这个例子中,我们在Package级别定义了一个变量,名称为test

然后,我们在数据流中有一个Script Component,我们尝试在里面对上面这个变量进行读写

代码大致如下

/* Microsoft SQL Server Integration Services Script Component
*  Write scripts using Microsoft Visual C# 2008.
*  ScriptMain is the entry point class of the script.*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

using System.Windows.Forms;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{

    public override void PreExecute()
    {
        base.PreExecute();
        /*
          Add your code here for preprocessing or remove if not needed
        */
    }

    public override void PostExecute()
    {
        base.PostExecute();
        /*
          Add your code here for postprocessing or remove if not needed
          You can set read/write variables here, for example:
          Variables.MyIntVar = 100
        */
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        /*
          Add your code here
        */

        

    }

}

 

代码很简单,也很自然。我只是作为演示,这里读取到那个变量之后,显示出来。

但是这个代码是不能运行的,有如下错误

上述错误的意思是,除非在PostExecute方法里面,是不可以对变量进行读写的。这里的原因是,ProcessInputRow这个方法,因为是每一行数据都会执行一次,所以如果这里随意读写变量的话,会因为要频繁加锁和解锁,造成效率方面的问题。

 

这里谈到了一个加锁的问题。为什么会有这个问题呢?其实很简单,因为变量是定义在Package级别,所以很可能几个任务在同时访问这些变量,都在对其进行读写。如果不加锁,则可能导致不可预期的结果。

 

如果你理解了上述机制,而且也确定可以承担锁定可能带来的性能损耗,那么要解决问题,可以通过如下的方式实现

 

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        /*
          Add your code here
        */

        VariableDispenser.LockForRead("User::test");//这里先声明对某个变量进行锁定

        IDTSVariables100 vs = null;
        this.VariableDispenser.GetVariables(out vs);//通过VariableDispenser获取变量集合
        MessageBox.Show(vs["User::test"].Value.ToString());

        vs.Unlock();//解锁

    }
时间: 2024-08-30 19:22:13

如何在SSIS的脚本组件中访问变量的相关文章

如何在shell脚本中使用变量

如何在shell脚本中使用变量 在每种编程语言中,变量都扮演了一个重要的角色.在Linux shell脚本编程中,我们使用两种类型的变量:系统定义的变量和用户定义的变量. shell脚本中的变量是用来调用一个数值或者字符值的手段.与正规的编程语言不同的是,shell脚本不要求你去为变量声明一个类型. 在本文中,我们将讨论shell脚本编程中的变量及其类型,以及如何设置和使用这些变量. 系统定义的变量: 这些变量由操作系统(Linux)自身创建并维护,通常它们以大写字母定义,我们可以通过命令"$

ASP脚本组件的特点

脚本     我们应该从正反两方面考虑在工作中使用ASP脚本组件的必要性.与编译的组件比较,ASP脚本组件有一个明显的特点:WSC脚本文件可在任何时候进行编辑,在下一次执行时,组件中的变化可自动反映出来.不需要重新编译,不需重新启动服务器释放现有组件的引用,也不需要重新注册.并且,如果组件工作状态良好,可选用合适的语言,用已证明可靠的代码和/或算法创建一个编译版本,这同样适用于任何可转换组件.    ASP脚本组件可适应COM +.事实上,与其他ASP内置对象一样,这种组件可访问ObjectCo

php中Smarty 访问变量的几种方式

$tpl=new Smarty();//新建一个smarty对象,我使用的是Smarty-3.1.6版本 1.设置smarty模板路径$tpl->setTemplateDir():默认情况下是templates 2.设置smarty模板编译路径$tpl->setCompileDir();默认情况下是templates_c 3.设置smarty模板引擎的左右 分隔符,  代码如下 复制代码 $tpl->left_delimiter="<{"; $tpl->r

php使用Smarty的相关注意事项及访问变量的几种方式_php模板

$tpl=new Smarty();//新建一个smarty对象,我使用的是Smarty-3.1.6版本1.设置smarty模板路径$tpl->setTemplateDir():默认情况下是templates2.设置smarty模板编译路径$tpl->setCompileDir();默认情况下是templates_c3.设置smarty模板引擎的左右 分隔符,        $tpl->left_delimiter="<{";        $tpl->r

Smarty 访问变量的几种方式及事项

$tpl=new Smarty();//新建一个smarty对象,我使用的是Smarty-3.1.6版本 1.设置smarty模板路径$tpl->setTemplateDir():默认情况下是templates 2.设置smarty模板编译路径$tpl->setCompileDir();默认情况下是templates_c 3.设置smarty模板引擎的左右 分隔符,  代码如下 复制代码        $tpl->left_delimiter="<{";    

详解:如何在.NET中访问MySQL数据库?

如果你不是只在大集团公司工作过的话,你一定会有机会接触到MySQL,虽然它并不支持事务处理,存储过程,但是它提供的功能一定能满足你的大部分需求,另外,简洁的MySQL也有一些它独到的优势,在有些时候,它的速度甚至超过大型数据库. 那么如何在.NET中访问MySQL数据库呢?也许很多人马上会说:用OLEDB嘛,但是事实上采用.NET OleDb Data Provider并不能访问MySQL,如果你使用的话,系统会提示你:"Net Data OLE DB 提供程序 (System.Data.Odb

如何在.NET中访问MySQL数据库

mysql|访问|数据|数据库 摘要 MySQL作为一种小型关系数据库,它以低廉的价格.强大的功能.不俗的速度和开放源码的特性赢得了大量中小型企业及个人用户的青睐.但是在.NET中访问MySQL数据库却并没有想象中那么方便,因为.NET OleDb Data Provider和MySQL的兼容性并不理想.本文介绍了两种在.NET中访问MySQL数据库的方法,并对这两种方法做了一个简单的性能对比. 引言 如果你不是只在大集团公司工作过的话,你一定会有机会接触到MySQL,虽然它并不支持事务处理,存

如何在 SSIS 中读取 SharePoint List

前言 由于项目需要, 我们会从SharePoint 上读取一些配置数据, 同时也有可能执行一些回写操作去更新SharePoint 的数据. 之前没有做过这样的操作, 有的也应该是通过 C# 编程去获取或者写入一些数据. 查阅了一些相关的文章, 自己也动手测试了一下如何在 SSIS Package 中访问SharePoint List 并将数据写入 SharePoint List. 两个操作 读取SharePoint List 的数据到数据库 从数据库中筛选一些数据然后插入到一个新的 ShareP

如何在SSIS中读取 SharePoint List

前言 由于项目需要, 我们会从SharePoint 上读取一些配置数据, 同时也有可能执行一些回写操作去更新SharePoint 的数据. 之前没有做过这样的操作, 有的也应该是通过 C# 编程去获取或者写入一些数据. 查阅了一些相关的文章, 自己也动手测试了一下如何在 SSIS Package 中访问SharePoint List 并将数据写入 SharePoint List. 两个操作 读取SharePoint List 的数据到数据库 从数据库中筛选一些数据然后插入到一个新的 ShareP