如何在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
        */

        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; }

时间: 2024-10-12 16:22:59

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

GCD2 :在Block Object中访问变量

问题: 你想要理解在 Objective-C 方法和在 Block Objects 中访问变量的区别 方案: 这儿简单总结一下关于 Block Objects 变量你需要知道的内容: 1.局部变量在 Block Objects 和 Objective-C 方法中的工作原理非常相似. 2.对于内联Block Objects,局部变量不仅包含Block内部定义的变量,并且包含在Block Objects 执行方法中定义的变量.(随后会有举例) 3.在 Objective-C 类中运行的独立 Bloc

【转载】如何在 C#中访问 JavaScript函数?

如何在 C#中访问 JavaScript函数? 时间:13-10-17 栏目:Unity3D教程 作者:zqcyou 评论:0 如何在 C#中访问 JavaScript函数?答案如下:c#代码中执行 javaScript函数: 方法一:1. 1 Page.RegisterStartupScript("ggg","<script>SetVisible(1);</script>"); 方法二:使用 Literal类,然后 1 2 3 4 5 6

微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配置,还特意测试过这个细节,获取错误并理解了这个功能.但是现在回去再次测试 2008 的版本时,发现这个功能在 2008 中其实也是错误的,把我印象中的测试结果完全给推翻了,所以到现在已经搞不清楚我当时到底是如果得出这个错误的. 疑似功能 Bug 描述 在 SSIS 包中定义了用户自定义变量 - PV

每天一个JavaScript实例-从js脚本中访问object元素中的SVG

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-从js脚本中访问object元素中的SVG</title> <style> </style> </head> &l

[翻译]Component Registration in Script System 在脚本系统中注册组件

Component Registration in Script System 在脚本系统中注册组件   To refer to our component from a script, the class, its properties and methods must first be registered in the script system. You may place the registration code in a file with the same name as the

如何在vue &amp;&amp; webpack 项目中的单文件组件中引入css

引入方式很简单,就是在script下使用require()即可. 因为import 是import...from 的形式,所以是不需要的. <script> import {mapState, mapMutations} from "vuex" import DetailItem from "@components/detail" require('../assets/css/swiper-3.4.1.min.css') export default {

【Unity3D基础教程】给初学者看的Unity教程(二):所有脚本组件的基类 -- MonoBehaviour的前世今生

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全局变量.GameObject是游戏中的基本物件.GameObject是由Component组合而成的,GameObject本身必须有Transform的Component,这也加深了我们

如何在 Microsoft Visual C# .NET 中实现 Microsoft Excel 自动化

通过自动化过程,使用诸如 Visual C# .NET 这样的语言编写的应用程序就可以用编程方式来控制其他应用程序.利用 Excel 的自动化功能,您可以执行诸如新建工作簿.向工作簿添加数据或创建图表等操作.对于 Excel 和其他 Microsoft Office 应用程序,几乎所有可以通过用户界面手动执行的操作也都可以通过使用“自动化”功能以编程方式来执行. Excel 通过一种对象模型来公开这一程序功能.该对象模型是一些类和方法的集合,这些类和方法充当 Excel 的逻辑组件.例如,有 A

【Unity】6.3 通过 C# 脚本创建和访问游戏对象

分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 在游戏开发过程中,脚本不但需要访问脚本所在的游戏对象的组件,还经常需要访问和控制真他游戏对象.另外,根据项目需求,还可能需要通过脚本创建对象. 本节示例的最终运行效果如下: 二.查找场景中的游戏对象 在Unity脚本中,开发人员可以通过下面量的方式来访问游戏对象. 1.通过名称字符串来查找 使用函数GameObject.Find()查找在参数中指定的游戏对象.如果场景中存在指定名称的游戏对象,则返回该对象的引用,否则