通过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());
  }
 }
}
}