在脚本组件[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
请帮助吗?
答案 0 :(得分:6)
期待您的评论看起来您已经解决了这个问题,但我发布此答案是为了提供有关如何使用SSIS脚本中的变量以及如何解决类似问题的信息,因此它可以帮助其他用户
SSIS变量
变量存储可在所有SSIS组件和容器中使用的值。
Integration Services支持两种类型的变量:用户定义的变量和系统变量。用户定义的变量由包开发人员定义,系统变量由Integration Services定义。您可以根据程序包的要求创建任意数量的用户定义变量,但不能创建其他系统变量。 More info in this MSDN article
在脚本组件中使用变量
每个脚本都有一个ReadOnlyVariables
和ReadWriteVariables
列表,可以在“脚本”页面上定义。
<强> ReadOnlyVariables 强>
ReadOnlyVariables
可以从所有脚本子系统中访问,并且在命名时为Read-Only
。
<强> ReadWriteVariables 强>
ReadWriteVariables集合仅在
PostExecute
方法中可用,以最大限度地提高性能并最大限度地降低锁定冲突的风险。因此,在处理每行数据时,不能直接递增包变量的值。相反,增加局部变量的值,并在处理完所有数据后将包变量的值设置为PostExecute方法中的局部变量的值。您还可以使用VariableDispenser属性来解决此限制。但是,在处理每一行时直接写入包变量将对性能产生负面影响并增加锁定冲突的风险。 More in this MSDN article
使用变量的方法
有3种方法可以处理变量:
ReadOnlyVariables
或ReadWriteVariables
后直接访问它们使用变量分配器(LockForRead
和LockForWrite
方法)
IDTSVariables100 vars = null;
VariableDispenser.LockForRead("User::MyVariable");
VariableDispenser.GetVariables(out vars);
string TaskName = vars["User::MyVariable"].Value.ToString();
vars.Unlock();
使用SSIS日志记录任务:读取变量并将其记录到执行日志,消息框或文件
有很多文章谈论这些方法,你可以参考它们来了解更多