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

VHK*_*VHK 4 vb.net sql-server ssis etl ssis-2012

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

错误:

锁定读写访问的变量集合在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
Run Code Online (Sandbox Code Playgroud)

我还尝试读取局部变量中的值,然后在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
Run Code Online (Sandbox Code Playgroud)

请帮忙吗?

Had*_*adi 7

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

SSIS变量

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

Integration Services支持两种类型的变量:用户定义的变量和系统变量.用户定义的变量由包开发人员定义,系统变量由Integration Services定义.您可以根据程序包的要求创建任意数量的用户定义变量,但不能创建其他系统变量.这篇MSDN文章中的更多信息

在脚本组件中使用变量

每个脚本都有一个ReadOnlyVariables,并ReadWriteVariables可以在脚本页面上定义的列表.

ReadOnlyVariables

ReadOnlyVariables可以从所有脚本Sub访问它们,它们Read-Only就像它们的名称一样.

ReadWriteVariables

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

使用变量的方法

有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();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用SSIS日志记录任务:读取变量并将其记录到执行日志,消息框或文件

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