无法在SSIS的脚本组件中获取“ReadWrite”变量值

时间:2017-03-09 06:01:11

标签: sql-server vb.net ssis etl ssis-2012

在脚本组件[Input0_ProcessInputRow]中,我试图获取“ReadWrite”全局变量值,它会抛出错误。

ERROR:

  

在PostExecute之外无法使用为读写访​​问而锁定的变量集合。

以下是我的代码

If Row.Column13 = "C" Then
    Variables.mTotalCreditCount = Variables.mTotalCreditCount - 1
    Variables.mTotalCreditAmount = Variables.mTotalCreditAmount - CDbl(Row.Column14)

ElseIf Row.Column13 = "D" Then
    Variables.mTotalDebitCount = Variables.mTotalDebitCount - 1
    Variables.mTotalDebitAmount = Variables.mTotalDebitAmount - CDbl(Row.Column14)

End If

我还尝试读取局部变量中的值,然后在PostExecute()中分配给全局变量,如下所示。没有运气

If Row.Column13 = "C" Then

    mTotalCrCnt = Variables.mTotalCreditCount - 1
    mTotalCrAmt = Variables.mTotalCreditAmount - CDbl(Row.Column14)
ElseIf Row.Column13 = "D" Then

    mTotalDbCnt = Variables.mTotalDebitCount
    mTotalDbCnt = mTotalDbCnt - 1
    mTotalDbAmt = Variables.mTotalDebitAmount
    mTotalDbAmt = mTotalDbAmt - CDbl(Row.Column14)
End If

Public Overrides Sub PostExecute()
    MyBase.PostExecute()
    Variables.ProcessCount = intProcessCount
    Variables.mTotalCreditCount = mTotalCrCnt
    Variables.mTotalCreditAmount = mTotalCrAmt
    Variables.mTotalDebitCount = mTotalDbCnt
    Variables.mTotalDebitAmount = mTotalDbAmt
End Sub

请帮助吗?

1 个答案:

答案 0 :(得分:6)

期待您的评论看起来您已经解决了这个问题,但我发布此答案是为了提供有关如何使用SSIS脚本中的变量以及如何解决类似问题的信息,因此它可以帮助其他用户

SSIS变量

变量存储可在所有SSIS组件和容器中使用的值。

  

Integration Services支持两种类型的变量:用户定义的变量和系统变量。用户定义的变量由包开发人员定义,系统变量由Integration Services定义。您可以根据程序包的要求创建任意数量的用户定义变量,但不能创建其他系统变量。 More info in this MSDN article

在脚本组件中使用变量

每个脚本都有一个ReadOnlyVariablesReadWriteVariables列表,可以在“脚本”页面上定义。

<强> ReadOnlyVariables

ReadOnlyVariables可以从所有脚本子系统中访问,并且在命名时为Read-Only

<强> ReadWriteVariables

  

ReadWriteVariables集合仅在PostExecute方法中可用,以最大限度地提高性能并最大限度地降低锁定冲突的风险。因此,在处理每行数据时,不能直接递增包变量的值。相反,增加局部变量的值,并在处理完所有数据后将包变量的值设置为PostExecute方法中的局部变量的值。您还可以使用VariableDispenser属性来解决此限制。但是,在处理每一行时直接写入包变量将对性能产生负面影响并增加锁定冲突的风险。 More in this MSDN article

使用变量的方法

有3种方法可以处理变量:

  1. 在脚本页面中选择ReadOnlyVariablesReadWriteVariables后直接访问它们
  2. 使用变量分配器(LockForReadLockForWrite方法)

    IDTSVariables100 vars = null;
    VariableDispenser.LockForRead("User::MyVariable");
    VariableDispenser.GetVariables(out vars);
    string TaskName = vars["User::MyVariable"].Value.ToString();
    vars.Unlock();
    
  3. 使用SSIS日志记录任务:读取变量并将其记录到执行日志,消息框或文件

  4. 有很多文章谈论这些方法,你可以参考它们来了解更多