SSIS脚本组件运​​行时错误

时间:2013-07-18 01:41:10

标签: ssis

我运行包时遇到了有效问题。它在我的电脑上运行失败并在其他任何人中取得成功。 该错误是由脚本组件(变为红色)引起的,它处于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)).

enter image description here

我猜这个问题与变量有关,因为当我删除所有与变量相关的代码时,包运行成功。脚本组件中的代码:

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中运行(不在同一个包含错误的包中)

1 个答案:

答案 0 :(得分:0)

SSIS中的所有任务/容器具有相同的生命周期。您可以通过观看Event Handlers火来看到其中一些内容。在脚本组件中,在数据流任务内部,将进行各种步骤。部分是验证(这个合同说我应该从这个表中有一个整数类型的列 - 我可以连接,它是否存在,它是正确的类型等)。

验证后,任务将具有设置和拆除步骤以执行。由于您似乎在脚本中使用SSIS变量,因此花费了前/后执行时间的一部分,允许将变量(SSIS)转换为变量(.net)并再次返回。

在我看到PostExecute方法中导致失败的特定代码之前,我无法说明代码问题可能是什么。

我无法重新创建您的问题。虽然这是2012版Integration Services,但您使用它时脚本组件的行为将相同。我没有将输出发送到Excel,但这不应该是因为它是脚本失败。

data flow task

我的脚本组件。在编辑代码之前,我在菜单中选择了我的变量,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++;
        }
    }

}