SSIS数据流组件开发(2) 转载
事实上,我们只要在继承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中
设置组件执行时断点,然后继续数据流……