首页 > 编程 > .NET > 正文

通过Visual C#.NET建一个DTS任务

2024-07-10 13:00:09
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 本文描述了如何利用visual c#.net 创建一个dts 自定义的任务。你可以通过c#.net创建自定义的任务的方式扩展dts的功能。之后你可以安装并注册任务,他讲出现在dts设计其中,就像默认的dts任务。总之,你能够使用.net framework创建自定义的任务。

      在本文中除了讲创建一个dts自定义任务外,还包括一下部分内容:

      1、这篇文章中自定义的代码分为编译、注册和安装自定义任务;

       2、这部分一个有特色的部分就是你可以运行自定义的任务;

       3、在开发过程中你可以使用本文提及的一些工具(除非另有说明,这些工具已经包含在.net中了,您可以通过.net的命令行运行这些工具)。

       为dtsspkg.dll创建一个及时的包

      如果一个基于微软.net客户机访问一个com组件,你必须使用一个包(这个组件包含的)。这类的包是及时的运行包(rcw)并且你也可以通过开放dtspkg.dll的类型库编译。你也可以使用类型库导出工具(tlbimp.exe)编译rcw,如:

    tlbimp.exe “c:/programfiles/microsoft sqlserver/80/tools/binn/dtspkg.dll”/out:microsoft.sqlservver.dtspkg80.dll/keyfile:dtspkg.snk

    “/keyfile”参数代表microsoft.sqlserver.dtspkg80.dll带有强类型名用public或private关键字。使用强类型名工具(sn.exe)在dtspkg.snk 前创建关键字:

    sn.exe –k dtspkg.snk

      你应该使用一个强类型名像其他的全局集合缓存,因为你安装了运行包。

      在全局集合缓存中安装运行包

      用全局集合缓存工具(gacutil.exe)安装运行包:

    gacutil.exe /i microsoft.sqlserver.dtspkg80.dll

     安装了运行包后,你可以像添加.netc#工程中的引用一样的添加。
      
      为自定义的任务添加代码

      代码的自定义注册。.net没有开放dllreginsterserver 和dllunregisterserver 像com组件的入口,但是你可以使用comregisterfunctionattribute 类执行任务注册和撤销注册。在自定义类声明之前添加下面代码:

    [guid("a39847f3-5845-4459-a25e-de73a8e3cd48"), comvisible(true)]

    [progid("dts.simpletask")]

    public class simpletask : customtask

    {

    //implementation of custom task

    }

      下面的代码是一个函数注册的范例执行。函数的全部代码在自定义任务的编译、注册和安装部分 。

    [system.runtime.interopservices.comregisterfunctionattribute()]

    static void registerserver(type t)

    {

    //code to register custom task

    }

      注册函数增加下面的键值用来注册。

    hkey_classes_root/clsid/a39847f3-5845-4459-a25e-de73a8e3cd48/implemented categories/{10020200-eb1c-11cf-ae6e-00aa004a34d5}

    10020200-eb1c-11cf-ae6e-00aa004a34d5是dts包对象的类编号。因为所有的自定义的任务执行自定义的接口所以必须注册。注册函数添加下面的注册键值:

    hkey_current_user/software/microsoft/microsoft sql server/80/dts/enumeration/tasks/a39847f3-5845-4459-a25e-de73a8e3cd48

      下面的dts任务缓存目录列表,使自定义的任务出现在dts设计器中:

    hkey_current_user/software/microsoft/microsoft sql server/80/dts/enumeration/tasks/

      下面的代码示范非注册函数的任务移出的执行。面注册函数是comunregisterfunctionattribute类在.net运行库的一部分。想浏览这个函数的完整代码,你可以看“编译、注册和安装自定义任务”部分:

    [system.runtime.interopservices.comunregisterfunctionattribute()]

    static void unregisterserver(type t)

    {

    //code to unregister custom task

    }

      免注册函数通过从注册表中删除下面键值从dts任务缓存中移出任务

    hkey_current_user/software/microsoft/microsoft sql server/80/dts/enumeration/tasks/a39847f3-5845-4459-a25e-de73a8e3cd48

      最后,自定义的任务像dual_interface com组件一样被开放。您从所有的类的public,非静态的字段,属性和方法创建一个默认的接口。在下面的一行代码在自定义任务源文件中using应用之后:

    [assembly:classinterface(classinterfacetype.autodual)]

      这部分的代码已经完全列举了。

      增加功能性的自定义任务

      本文“编译、注册和安装自定义任务”部分包含一个简单的dts自定义任务代码。 任务有两个属性:name 和description,description属性的值就会出现在消息框中。这个例子的描述了一个最小化的代码你可以使用已有的功能性的dts定义任务。然而,你可以通过执行customtaskui接口创建一个用户界面,但是那并不作讨论。通过只执行自定义的接口,dts设计者为自定义任务创建一个默认的有户界面。

      所有的dts自定义任务执行自定义任务接口。自定义的用户接口是由两个属性,一个集合和一个方法:

      1、 name和description属性;

      2、 properties集;

      3、 execute方法。

      所有的自定义任务应该执行属性、属性集和execute方法。

      编译、注册和安装自定义任务

    using system;
    using system.runtime.interopservices;
    using microsoft.sqlserver.dtspkg80;
    using microsoft.win32;
    using system.windows.forms;

    [assembly:classinterface(classinterfacetype.autodual)]

    namespace dts
    {
     [guid("38ed4f80-9ef4-4752-8478-65d2db3ba7dd"), comvisible(true)] //guid is created by using guidgen.exe
     [progid("dts.simplecustomtask")]
     public class simplecustomtask : customtask
     {
      private string name;
      private string description;
      public simplecustomtask()
      {
       name = "";
       description = "simplecustomtask description";
      }
      public void execute(object ppackage, object ppackageevents, object ppackagelog, ref microsoft.sqlserver.dtspkg80.dtstaskexecresult ptaskresult)

      {
       //assume failure at the outset
       ptaskresult= dtstaskexecresult.dtstaskexecresult_failure;
       try
       {
       package2 package = (package2) ppackage;
       packageevents packageevents = (packageevents) ppackageevents;
       packagelog packagelog = (packagelog) ppackagelog;
       messagebox.show(description);
       }
       //first catch com exceptions, and then all other exceptions
       catch(system.runtime.interopservices.comexception e)
       {
        console.writeline(e);
       }
       catch(system.exception e)
       {
        console.writeline(e);
       }

        //return success
       ptaskresult = dtstaskexecresult.dtstaskexecresult_success;
      }

      public string description
       {
       get { return this.description; }
       set { this.description = value; }
      }

      public string name
      {
       get { return name; }
       set { this.name = value; }
      }

      public microsoft.sqlserver.dtspkg80.properties properties
      {
       get { return null; }
      }

      [system.runtime.interopservices.comvisible(false)]
      override public string tostring()
      {
       return base.tostring();
      }

      //registration function for custom task.
      [system.runtime.interopservices.comregisterfunctionattribute()]
      static void registerserver(type t)
      {
       try
       {
        const string task_cache = "software//microsoft//microsoft sql server//80//dts//enumeration//tasks";
    const string catid_dtscustomtask = "{10020200-eb1c-11cf-ae6e-00aa004a34d5}";
    string guid = "{" + t.guid.tostring() + "}";
    guid = guid.toupper();
    console.writeline("registerserver {0}", guid);
    registrykey root;
    registrykey rk;
    registrykey nrk;
    // add com category in hkey_classes_root

    root = registry.classesroot;
    rk = root.opensubkey("clsid//" + guid + "//implemented categories", true);
    nrk = rk.createsubkey(catid_dtscustomtask);
    nrk.close();
    rk.close();
    root.close();
    // add to dts cache in hkey_current_user
    root = registry.currentuser;
    rk = root.opensubkey(task_cache, true);
    nrk = rk.createsubkey(guid);
    nrk.setvalue("", t.fullname);
    nrk.close();
    rk.close();
    root.close();
    simplecustomtask ct = new simplecustomtask();
      root = registry.classesroot;
    rk = root.opensubkey("clsid//" + guid, true);
    rk.setvalue("dtstaskdescription", ct.description);
    nrk.close();
      rk.close();
    root.close();
       }
       catch(exception e)
       {
        system.console.writeline(e.tostring());
       }
      }

     //unregistration function for custom task.
     [system.runtime.interopservices.comunregisterfunctionattribute()]
     static void unregisterserver(type t)
     {
      try
      {
    const string task_cache = "software//microsoft//microsoft sql server//80//dts//enumeration//tasks";
    string guid = "{" + t.guid.tostring() + "}";
    guid = guid.toupper();
    console.writeline("unregisterserver {0}", guid);
    registrykey root;
    registrykey rk;
    // delete from dts cache in hkey_current_user
    root = registry.currentuser;
    rk = root.opensubkey(task_cache, true);
    rk.deletesubkey(guid, false);
    rk.close();
    root.close();
      }
      catch(exception e)
      {
    system.console.writeline(e.tostring());
      }
     }
    }

    }


    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表