一次SSIS Package的调试经历

SSIS Package的调试有时是一个非常艰难的过程,由于SSIS 编译器给出的错误信息,可能并不完善,需要程序员根据错误信息抽丝拨茧,寻找错误的根源,进而解决问题。

第一部分:SSIS提供的调试工具

1,SSIS Package的 Control Flow 通过醒目的图标显示task的执行情况

在执行package的时候,如果一个Task上显示绿色的勾,表示task执行正常,如果显示的是红色的X,表示task执行异常。

通常SSIS Package调试的第一步就是寻找出错的Task,然后进入该task的data flow中查看报错的component。

一次SSIS Package的调试经历

在Task上显示错误信息,进入该task,发现Excel Source没有指定connection manager。

一次SSIS Package的调试经历

一次SSIS Package的调试经历

2,在package执行时,会出现一个progress显示执行的进度

如果错误,会在Progress中显示错误的信息

一次SSIS Package的调试经历

3,Data Viewer 查看从上游组件传递的数据

通过 点击蓝色的数据流线,Enable Data Viewer来查看数据。

一次SSIS Package的调试经历

4,设置breakpoint

选中Task,点击右键,选中Edit Breakpoint来设置断点,进行调试

一次SSIS Package的调试经历

5,package 事件,可以在事件中写入特殊的代码,当错误出现时,发送runtime的错误信息或将错误信息写入文档,方便程序员捕捉错误信息,提高debug的效率。

一次SSIS Package的调试经历

6,以上5种都是非常方便的调试工具,当然SSIS提供的辅助调试工具也有很多,各有用途,如果使用得当,将会使debug更有效率。

一次SSIS Package的调试经历

第二部分:示例

在使用scripte componet的一个package,出现一个错误信息 “object reference not set to an instance of an object”

说明在 scripte componet的C#代码中,并没有将对象设置为一个有效的实例。

  DataTable dt;  

public override void PreExecute() { base.PreExecute(); IDTSConnectionManager100 cnManager = Connections.Connection; SqlConnection cnn = (SqlConnection)cnManager.AcquireConnection(null); SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select code,name from [dbo].[tbExcel]"; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 60000; dt = new DataTable("dt"); SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.Fill(dt); }

从PreExecute函数中,可以看出,最有可能的错误原因是 cnManager 并没有获取到Package的Connection Manager

IDTSConnectionManager100 cnManager = Connections.Connection;

查看Script component的connection managers选项卡,已经设置了connection manager,那么错误的原因可能就是Name=Connection的Connection Manager的链接字符串有错误,导致无法连接到DB。

一次SSIS Package的调试经历

经验证,最终的结果跟推测一样,Connection Manager的链接字符串有错误,无法连接到DB,导致Script component执行失败。