我运行包时遇到了有效问题。它在我的电脑上运行失败并在其他任何人中取得成功。 该错误是由脚本组件(变为红色)引起的,它处于Post Execute阶段,而不是脚本组件中的post执行,而是在package的运行时。错误是:
Information: 0x40043008 at Data Flow Task, SSIS.Pipeline: Post Execute phase is beginning.
Error: 0xC0047062 at Data Flow Task, Script Component [263]: System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables100'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{22992C1D-393D-48FB-9A9F-4E4C62441CCA}' failed due to the following error: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)).
我猜这个问题与变量有关,因为当我删除所有与变量相关的代码时,包运行成功。脚本组件中的代码:
private int scheduled550;
private int scheduled620;
private int scheduled720;
private int scheduled820;
public override void PreExecute()
{
base.PreExecute();
scheduled550 = Variables.Count550;
scheduled620 = Variables.Count620;
scheduled720 = Variables.Count720;
scheduled820 = Variables.Count820;
}
public override void PostExecute()
{
base.PostExecute();
}
有没有人遇到过同样的问题?谁能告诉我POST执行阶段会做什么?感谢
更多信息:我曾尝试重新安装SQL Server,但这没有帮助。并非所有带变量的脚本组件都无法在我的SSIS中运行(不在同一个包含错误的包中)
答案 0 :(得分:0)
SSIS中的所有任务/容器具有相同的生命周期。您可以通过观看Event Handlers火来看到其中一些内容。在脚本组件中,在数据流任务内部,将进行各种步骤。部分是验证(这个合同说我应该从这个表中有一个整数类型的列 - 我可以连接,它是否存在,它是正确的类型等)。
验证后,任务将具有设置和拆除步骤以执行。由于您似乎在脚本中使用SSIS变量,因此花费了前/后执行时间的一部分,允许将变量(SSIS)转换为变量(.net)并再次返回。
在我看到PostExecute方法中导致失败的特定代码之前,我无法说明代码问题可能是什么。
我无法重新创建您的问题。虽然这是2012版Integration Services,但您使用它时脚本组件的行为将相同。我没有将输出发送到Excel,但这不应该是因为它是脚本失败。
我的脚本组件。在编辑代码之前,我在菜单中选择了我的变量,User :: Count550作为ReadOnly变量。
public class ScriptMain : UserComponent
{
private int scheduled550;
public override void PreExecute()
{
base.PreExecute();
this.scheduled550 = Variables.Count550;
}
public override void PostExecute()
{
base.PostExecute();
//this.Variables.Count550 = scheduled550;
//this.VariableDispenser.LockForWrite("Count550");
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (true)
{
this.scheduled550++;
}
}
}