我使用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组件的值返回给调用应用程序?
答案 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变量的运行时值。但是,您可以通过以下方式之一以不同方式实现获取已处理记录数的任务:
[SSIS.Pipeline] Information: "<your destination name>" wrote N rows.
按照MSDN中的说明执行包捕获事件,然后检查结果。 请注意,只有在SSIS中将包作为package.Execute
运行而不使用SSIS目录时,第二种方法才有效。如果您自己生成包并在生成后立即执行它 - 没关系,您就不会生成和部署SSISDB项目。