SSIS数据流组件开发(2) 转载
2011-03-02 18:30
369 查看
开发一个数据流组件,必须为组件实现运行时(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中
设置组件执行时断点,然后继续数据流……
事实上,我们只要在继承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数据流组件开发(1)转载
- SSIS数据流组件开发(1)
- SSIS数据流组件开发(2)
- SSIS数据流组件开发(1)
- SSIS数据流组件开发(2)
- SSIS数据流组件开发
- SSIS自定义数据流组件开发(血路)
- 在.net应用程序中使用用户控件-.NET教程,组件控件开发(转载)
- 【转载】Flex 调用外部JS(中级篇) - Uyang - Photoshop Flash Flex Apollo 教程 组件 开发 源代码
- 微信小程序开发—快速掌握组件及API的方法---转载
- 转载SSIS中的容器和数据流—数据转换(Transformations)
- 一个帖子学会Android开发四大组件(转载)
- 转载SSIS中的容器和数据流—数据转换(Transformations)续
- 为SSIS编写自定义数据流组件(DataFlow Component)之进阶篇:自定义编辑器
- 转载SSIS中的容器和数据流—举例说明数据转换任务
- 转载共享:ASP.NET自定义控件组件开发
- javascript组件开发方式(转载)
- 为SSIS编写自定义数据流组件(DataFlow Component)之入门篇
- 为SSIS编写自定义数据流组件(DataFlow Component)之进阶篇:自定义编辑器
- 【转载】Asp.NET大文件上传组件开发总结(二)---提取文件内容