欢迎光临
我们一直在努力

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

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

怎样通过visual c#.net创建一个dts任务

一、摘要

这篇文章描述了如何利用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)

相关推荐

  • 暂无文章