欢迎光临
我们一直在努力

通过Visual C#.NET建一个DTS任务-.NET教程,C#语言

建站超值云服务器,限时71元/月

本文描述了如何利用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());

  }

 }

}

}

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 通过Visual C#.NET建一个DTS任务-.NET教程,C#语言
分享到: 更多 (0)

相关推荐

  • 暂无文章