【问题标题】:Unable to fetch "ReadWrite" Variable Value in Script Component of SSIS无法在 SSIS 的脚本组件中获取“ReadWrite”变量值
【发布时间】:2017-03-09 06:01:11
【问题描述】:

在脚本组件 [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

我还尝试读取局部变量中的值,然后在 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

有什么帮助吗?

【问题讨论】:

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


【解决方案1】:

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

SSIS 变量

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

Integration Services 支持两种类型的变量:用户定义变量和系统变量。用户定义变量由包开发者定义,系统变量由集成服务定义。您可以根据包的需要创建任意数量的用户定义变量,但不能创建额外的系统变量。 More info in this MSDN article

在脚本组件中使用变量

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

ReadOnlyVariables

ReadOnlyVariables 可以从所有脚本 Sub 访问,它们被命名为 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 记录任务:读取变量并将其记录到执行日志、消息框或文件中

有很多文章在讲这个方法,你可以参考他们了解更多

【讨论】:

  • 哈迪,我编辑了你的代码,因为它没有构建。 BTW,关于第1步,ReadWriteVariables只能在PostExecute方法中直接访问,这就是这里的问题。你还有别的意思吗?
  • @Andrew 感谢您编辑代码。这个答案是在 OP 解决了他的问题后发布的。这是为了提供有关如何在脚本中使用变量的附加信息,因为 OP 没有提供任何信息。
猜你喜欢
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2012-07-25
相关资源
最近更新 更多