原文:如何在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
*/ MessageBox.Show(Variables.test.ToString()); } }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

上述错误的意思是,除非在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();//解锁 }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

最新文章

  1. Ubuntu16.10 主题flatabulous安装
  2. 泛函编程(28)-粗俗浅解:Functor, Applicative, Monad
  3. customTextbox
  4. HDU1518 Square(DFS,剪枝是关键呀)
  5. Android -- 自定义ImageView(圆形头像)
  6. mysql 并发控制
  7. jQuery 2.0.3 源码分析 bind/live/delegate/on
  8. Combiner
  9. rman进行备份、恢复
  10. Spring MVC 解读——@RequestMapping (1)(转)
  11. 1、Spark 通过api,hfile两种形式获取hbase数据,简单样例
  12. 写给C语言新手的话
  13. git常用命令,助你快速入门
  14. 【转载】Springboot整合 一 集成 redis
  15. mysql 和 sqlserver中备份一张表的区别
  16. bat安装python的msi包
  17. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
  18. 在 Ubuntu 16.04上安装 vsFTPd
  19. JavaSE——TCP协议网络编程(一)
  20. hdu 2110 基础母函数

热门文章

  1. c语言移位操作
  2. 实现strcmp非常easy的思维
  3. C++第11周(春)项目1 - 存储班长信息的学生类
  4. virtio-blk分析
  5. 【oracle案件】ORA-19502,ORA-27072
  6. Java多线程的wait(),notify(),notifyAll()
  7. hadoop-1.1.2 在Windows环境下的部署
  8. MyReport报表引擎2.1.0.0新功能
  9. ShareSDK for Android 2.3.8它已发表
  10. U菜1G变化8M该解决方案