如何从编程生成的SSIS包中获取已处理的行数到调用应用程序?

时间:2017-02-07 11:54:59

标签: c# sql-server ssis event-handling

我使用C#和SQL Server 2012以编程方式生成和执行SSIS包。生成的包每个包含一个数据流任务,其中包含用于读取CSV的平面文件源,以及连接到SQL Server的OLE DB目标。在它们之间是一个行计数组件,它连接了一个SSIS变量。

包执行结束后,我想将行计数中的值返回给我的调用应用程序。

似乎只是创建变量&行计数代码如下:

[...]

// Row count: Create a package variable to store the row count value
var ssisRowCountVariable = package.Variables.Add("MySsisVar", false, "User", 0);

// Row count: Create Row component
IDTSComponentMetaData100 componentRowCount = dataFlowTask.ComponentMetaDataCollection.New();
componentRowCount.Name = "RowCount";
componentRowCount.ComponentClassID = "DTSTransform.RowCount.4";

// Row count: Get row count design-time instance, and initialize component
CManagedComponentWrapper instanceRowCount = componentRowCount.Instantiate();
instanceRowCount.ProvideComponentProperties();

// Row count: Set the variable name property
instanceRowCount.SetComponentProperty("VariableName", "User::MySsisVar");

// Hooking up pipeline Paths
[...]

// Execute package
package.Execute()

然后尝试在程序包执行后读取值:

int Rows = Convert.ToInt32(ssisRowCountVariable.Value);

不起作用。

如何将Row Count组件的值返回给调用应用程序?

2 个答案:

答案 0 :(得分:3)

在使用第二种方法之后,我发现最好的方法就是按照问题中的描述连接Row Count组件,然后添加代码让它在值达到时触发事件设置或更改:

ssisRowCountVariable.RaiseChangeEvent = true;

现在设置一个事件处理程序,该处理程序派生自标准的DefaultEvents类以捕获OnVariableValueChanged事件:

class MySsisEvents : DefaultEvents
{
    public int Rows { get; private set; }

    public override void OnVariableValueChanged(DtsContainer DtsContainer, Variable variable, ref bool fireAgain)
    {
        this.Rows = Convert.ToInt32(variable.Value);
    }
}

必须修改对package.Execute()的调用以挂接事件处理程序,如下所示:

// Execute package
var mySsisEventHandler = new MySsisEvents();
package.Execute(null, null, mySsisEventHandler, null, null);

已处理的行数现在可用mySsisEventHandler.Rows

答案 1 :(得分:1)

不幸的是,您无法直接从package.Execute()调用获取Package变量的运行时值。但是,您可以通过以下方式之一以不同方式实现获取已处理记录数的任务:

  • 向Package添加任务,将处理后的行变量值保存到某个存储。任务可以是跟随DataFlow,也可以是PostExecute处理程序 存储可以是SQL数据库或其他类似Web服务;将使用SQL DB的执行SQL任务或Web服务的脚本任务/ Web服务任务保存值。这是此方法的good review
  • 使用DataFlow标准PostExecute信息性消息[SSIS.Pipeline] Information: "<your destination name>" wrote N rows.按照MSDN中的说明执行包捕获事件,然后检查结果。

请注意,只有在SSIS中将包作为package.Execute运行而不使用SSIS目录时,第二种方法才有效。如果您自己生成包并在生成后立即执行它 - 没关系,您就不会生成和部署SSISDB项目。