zoukankan      html  css  js  c++  java
  • SSIS数据流组件开发(2)

    开发一个数据流组件,必须为组件实现运行时(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。

  • 相关阅读:
    解决Data truncation: Truncated incorrect DOUBLE value: 'xxxxxxx';
    免费LOGO在线生成+免费图床 (亲测可用)
    解决问题:bat脚本手动执行没问题,自动执行不成功
    flask上线部署————“WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.”
    钉钉机器人自动推送测试报告
    Python 自动化测试报告通过钉钉机器人推送通知
    转载:如何将新建的项目完整的提交到gitlab上?
    GIT推送时,空文件夹无法添加
    ddt+excel接口自动化测试-HtmlTestRunner报告中用例名称显示excel中自定义的名称
    Exp9 Web安全基础 20154301仉鑫烨
  • 原文地址:https://www.cnblogs.com/esestt/p/782702.html
Copyright © 2011-2022 走看看