Cheney Shue

导航

 
开发一个数据流组件,必须为组件实现运行时(IDTSRuntimeComponent90)和设计时(IDTSRuntimeComponent90)接口。运行时接口包含组件的元数据和组件执行方法,设计时接口包含用户在BIDS中编辑组件时的方法。

事实上,我们只要在继承PipelineComponent类,重写类方法就可有开发自己想要的组件了。

简单的范例

在VS中新建一个类库项目。然后在项目中引用四个程序集:

         1.     Microsoft.SqlServer.PipelineHost

         2.     Microsoft.SqlServer.DTSPipelineWrap

         3.     Microsoft.SQLServer.ManagedDTS

         4.     Microsoft.SqlServer.DTSRuntimeWrap




然后建立一个继承PipelineComponent的类:



其中DtsPipelineComponent语句后是DtsPipelineComponentAttribute类中属性,定义了组件名称、类型、图标、是否可用高级编辑器、编辑界面等。关于自定义编辑界面,后面会专门讨论。

然后为程序集建立签名。



安装组件

按F5调试后,在项目的bin\debug\文件夹下找到编译的库文件,我这里编译的库文件是DataFlowComponent_1.dll,将库文件复制到<SQL Server实例安装路径>\90\DTS\PipelineComponents\下。然后在GAC中安装程序集,可以直接将库文件拖入<系统盘符>\windows\assemble,或者在命令行中输入gacutil /i "<项目文件夹>\bin\Debug\DataFlowComponent_1.dll"

在BIDS中新建一个SSIS包,这时在设计数据流工具箱中还看不到新开发的组件,右击工具箱,选“选择项”。



加入开发的组件



然后在数据流设计的工具箱中就可以发现这个组件,将组件加入到数据流,双击它,因为没有为组件设计编辑界面,所以默认打开的是高级编辑器。



尽管这个组件在数据流中可以执行,但它什么工作都不着,因为我们还没有定义它执行时的工作。

在开发过程中常常需要在BIDS中测试新版本,每次都要将库文件复制到SQL文件夹,再在GAC中安装是件非常麻烦的事。

可以在项目的生成事件中让编译成功后自动安装组件。选"编译" —— "生成事件..." —— "编译生成后事件"



假定你的系统和sql都装在C:下的默认路径,在编译后事件文本框中输入:
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -u DataFlowComponent_1.dll
copy DataFlowComponent_1.dll "C:\Program Files\Microsoft SQL Server\90\DTS\PipelineComponents\DataFlowComponent_1.dll"
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -i "C:\Program Files\Microsoft SQL Server\90\DTS\PipelineComponents\DataFlowComponent_1.dll"

这样在每次编译后,程序集会自动安装。
但如果你开启了两个VS 2005,一个在写数据流组件代码,一个用于设计数据流;希望在代码编译后马上能在数据流设计器中试用,那首先每次编译都要有一个更高版本的程序集。



例如上次编译的是1.0.0.0版本,那么再修改代码后再次编译就要使用1.0.0.1,编译完成后还要在数据流设计界面的工具箱中删除组件,然后再加入。

测试“设计时”

通常的开发状况是开启了两个VS实例,一个用于编写组件代码,暂且将它叫做VS_A;一个在数据流设计界面中测试组件,将它叫做VS_B。

在VS_A中的菜单栏中,选“调试” —— “附加到进程...”

 

将VS_B加入



然后在VS_B中加入组件,可以在VS_A设置断点,组件的所有事件和变量都可以在VS_A中捕获到。



测试“运行时”

假设我们要在数据流中测试“Ado Source VB”组件(这个组件是SQL Server 2005自带的Sample),在VS_B的数据流中加入一个脚本组件,脚本组件的代码如下:

Public Class ScriptMain
    Inherits UserComponent

    Public Overrides Sub 输入0_ProcessInputRow(ByVal Row As 输入0Buffer)
        '
        ' Add your code here
        '
    End Sub

    Public Overrides Sub PreExecute()
        MsgBox("Begin Debug")
        MyBase.PreExecute()
    End Sub

End Class

这个脚本组件的目的是让数据执行时出现一个Msgbox,以中断数据流。

在MsgBox出现后,将VS_A加入到DtsDebugHost.exe中



设置组件执行时断点,然后继续数据流……


由于最近工作繁忙,关于SSIS数据流组件的开发我暂时不打算继续写下去,抱歉。
SSIS组件对非OLE DB连接的兼容性不是很好,而且在SQL Server 2008 CTP3中还看到对Excel 07文件的支持。
自己动手开发是难免的,微软已提供了很多的Sample,感兴趣的话可以到官方网站下载,重新修改修改就OK。

posted on 2007-06-13 21:39  Cheney Shue  阅读(4375)  评论(9编辑  收藏  举报