0

当我运行我的包时,我遇到了一个有效的问题。它在我的电脑上运行失败,在其他任何人上运行成功。该错误是由Script Component(变为红色)引起的,并且处于Post Execute阶段,而不是脚本组件中的post execute,而是在包的运行时。错误是:

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 Execute 阶段会做什么?谢谢

更多信息:我尝试重新安装 SQL Server,但这无济于事。并非所有带有变量的脚本组件都无法在我的 SSIS 中运行(与错误之一不在同一个包中)

4

1 回答 1

0

SSIS 中的所有任务/容器都具有相同的生命周期。您可以通过观看事件处理程序触发来了解其中的一些内容。在脚本组件中,在数据流任务内,将执行各种步骤。其中一部分是验证(这个合同说我应该从这个表中获得一个整数类型的列——我可以连接,它是否存在,它是否是正确的类型等)。

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

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

我无法重现您的问题。虽然这是 Integration Services 的 2012 版,但您使用的脚本组件将表现相同。我没有将输出发送到 Excel,但考虑到它是失败的脚本,这无关紧要。

数据流任务

我的脚本组件。在编辑我的代码之前,我在菜单中选择了我的变量 User::Count550 作为只读变量。

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++;
        }
    }

}
于 2013-07-18T02:12:50.657 回答