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)
请帮忙吗?
看看你的评论看起来你已经解决了这个问题,但是我发布这个答案来提供有关如何使用SSIS脚本中的变量以及如何解决类似问题的信息,因此它可以帮助其他用户
SSIS变量
变量存储可在所有SSIS组件和容器中使用的值.
Integration Services支持两种类型的变量:用户定义的变量和系统变量.用户定义的变量由包开发人员定义,系统变量由Integration Services定义.您可以根据程序包的要求创建任意数量的用户定义变量,但不能创建其他系统变量.这篇MSDN文章中的更多信息
在脚本组件中使用变量
每个脚本都有一个ReadOnlyVariables
,并ReadWriteVariables
可以在脚本页面上定义的列表.
ReadOnlyVariables
ReadOnlyVariables
可以从所有脚本Sub访问它们,它们Read-Only
就像它们的名称一样.
ReadWriteVariables
ReadWriteVariables集合仅在
PostExecute
方法中可用,以最大限度地提高性能并最大程度地降低锁定冲突的风险.因此,在处理每行数据时,不能直接递增包变量的值.相反,增加局部变量的值,并在处理完所有数据后将包变量的值设置为PostExecute方法中的局部变量的值.您还可以使用VariableDispenser属性来解决此限制.但是,在处理每一行时直接写入包变量将对性能产生负面影响并增加锁定冲突的风险.更多在这篇MSDN文章中
使用变量的方法
有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();
Run Code Online (Sandbox Code Playgroud)使用SSIS日志记录任务:读取变量并将其记录到执行日志,消息框或文件
有很多文章谈论这些方法,你可以参考它们来了解更多