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