通過(guò)Visual C#.NET建一個(gè)DTS任務(wù)
發(fā)表時(shí)間:2024-02-16 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本文描述了如何利用Visual C#.net 創(chuàng)建一個(gè)DTS 自定義的任務(wù)。你可以通過(guò)C#.net創(chuàng)建自定義的任務(wù)的方式擴(kuò)展DTS的功能。之后你可以安裝并注冊(cè)任務(wù),他講出現(xiàn)在DTS設(shè)計(jì)其中,就像默認(rèn)的DTS任務(wù)。總之,你能夠使用.NET Framework創(chuàng)建自定義的任務(wù)! ≡诒疚闹谐酥v創(chuàng)建一...
本文描述了如何利用Visual C#.net 創(chuàng)建一個(gè)DTS 自定義的任務(wù)。你可以通過(guò)C#.net創(chuàng)建自定義的任務(wù)的方式擴(kuò)展DTS的功能。之后你可以安裝并注冊(cè)任務(wù),他講出現(xiàn)在DTS設(shè)計(jì)其中,就像默認(rèn)的DTS任務(wù)?傊隳軌蚴褂.NET Framework創(chuàng)建自定義的任務(wù)。
在本文中除了講創(chuàng)建一個(gè)DTS自定義任務(wù)外,還包括一下部分內(nèi)容:
1、這篇文章中自定義的代碼分為編譯、注冊(cè)和安裝自定義任務(wù);
2、這部分一個(gè)有特色的部分就是你可以運(yùn)行自定義的任務(wù);
3、在開(kāi)發(fā)過(guò)程中你可以使用本文提及的一些工具(除非另有說(shuō)明,這些工具已經(jīng)包含在.NET中了,您可以通過(guò).NET的命令行運(yùn)行這些工具)。
為DTSSpkg.dll創(chuàng)建一個(gè)及時(shí)的包
如果一個(gè)基于微軟.NET客戶(hù)機(jī)訪(fǎng)問(wèn)一個(gè)COM組件,你必須使用一個(gè)包(這個(gè)組件包含的)。這類(lèi)的包是及時(shí)的運(yùn)行包(RCW)并且你也可以通過(guò)開(kāi)放Dtspkg.dll的類(lèi)型庫(kù)編譯。你也可以使用類(lèi)型庫(kù)導(dǎo)出工具(Tlbimp.exe)編譯RCW,如:
tlbimp.exe “C:\ProgramFiles\Microsoft SQLServer\80\tools\Binn\dtspkg.dll”/out:Microsoft.SQLServver.DTSPKG80.dll/keyfile:DTSPkg.snk
“/keyfile”參數(shù)代表Microsoft.SQLServer.DTSPkg80.dll帶有強(qiáng)類(lèi)型名用public或private關(guān)鍵字。使用強(qiáng)類(lèi)型名工具(sn.exe)在DTSPkg.snk 前創(chuàng)建關(guān)鍵字:
sn.exe –k DTSPkg.snk
你應(yīng)該使用一個(gè)強(qiáng)類(lèi)型名像其他的全局集合緩存,因?yàn)槟惆惭b了運(yùn)行包。
在全局集合緩存中安裝運(yùn)行包
用全局集合緩存工具(GaCutil.exe)安裝運(yùn)行包:
gacutil.exe /I Microsoft.SQLServer.DTSPkg80.dll
安裝了運(yùn)行包后,你可以像添加.NETC#工程中的引用一樣的添加。
為自定義的任務(wù)添加代碼
代碼的自定義注冊(cè)。.NET沒(méi)有開(kāi)放DllReginsterServer 和DllUnregisterServer 像COM組件的入口,但是你可以使用ComRegisterFunctionAttribute 類(lèi)執(zhí)行任務(wù)注冊(cè)和撤銷(xiāo)注冊(cè)。在自定義類(lèi)聲明之前添加下面代碼:
[Guid("A39847F3-5845-4459-A25E-DE73A8E3CD48"), ComVisible(true)]
[ProgId("DTS.SimpleTask")]
public class SimpleTask : CustomTask
{
//implementation of custom task
}
下面的代碼是一個(gè)函數(shù)注冊(cè)的范例執(zhí)行。函數(shù)的全部代碼在自定義任務(wù)的編譯、注冊(cè)和安裝部分 。
[System.Runtime.InteropServices.ComRegisterFunctionAttribute()]
static void RegisterServer(Type t)
{
//code to register custom task
}
注冊(cè)函數(shù)增加下面的鍵值用來(lái)注冊(cè)。
HKEY_CLASSES_ROOT\CLSID\A39847F3-5845-4459-A25E-DE73A8E3CD48\Implemented Categories\{10020200-EB1C-11CF-AE6E-00AA004A34D5}
10020200-EB1C-11CF-AE6E-00AA004A34D5是DTS包對(duì)象的類(lèi)編號(hào)。因?yàn)樗械淖远x的任務(wù)執(zhí)行自定義的接口所以必須注冊(cè)。注冊(cè)函數(shù)添加下面的注冊(cè)鍵值:
HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks\A39847F3-5845-4459-A25E-DE73A8E3CD48
下面的DTS任務(wù)緩存目錄列表,使自定義的任務(wù)出現(xiàn)在DTS設(shè)計(jì)器中:
HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks\
下面的代碼示范非注冊(cè)函數(shù)的任務(wù)移出的執(zhí)行。面注冊(cè)函數(shù)是ComUnregisterFunctionAttribute類(lèi)在.NET運(yùn)行庫(kù)的一部分。想瀏覽這個(gè)函數(shù)的完整代碼,你可以看“編譯、注冊(cè)和安裝自定義任務(wù)”部分:
[System.Runtime.InteropServices.ComUnregisterFunctionAttribute()]
static void UnregisterServer(Type t)
{
//code to unregister custom task
}
免注冊(cè)函數(shù)通過(guò)從注冊(cè)表中刪除下面鍵值從DTS任務(wù)緩存中移出任務(wù)
HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks\A39847F3-5845-4459-A25E-DE73A8E3CD48
最后,自定義的任務(wù)像dual_interface COM組件一樣被開(kāi)放。您從所有的類(lèi)的public,非靜態(tài)的字段,屬性和方法創(chuàng)建一個(gè)默認(rèn)的接口。在下面的一行代碼在自定義任務(wù)源文件中USING應(yīng)用之后:
[assembly:ClassInterface(ClassInterfaceType.AutoDual)]
這部分的代碼已經(jīng)完全列舉了。
增加功能性的自定義任務(wù)
本文“編譯、注冊(cè)和安裝自定義任務(wù)”部分包含一個(gè)簡(jiǎn)單的DTS自定義任務(wù)代碼。 任務(wù)有兩個(gè)屬性:Name 和Description,Description屬性的值就會(huì)出現(xiàn)在消息框中。這個(gè)例子的描述了一個(gè)最小化的代碼你可以使用已有的功能性的DTS定義任務(wù)。然而,你可以通過(guò)執(zhí)行CustomTaskUI接口創(chuàng)建一個(gè)用戶(hù)界面,但是那并不作討論。通過(guò)只執(zhí)行自定義的接口,DTS設(shè)計(jì)者為自定義任務(wù)創(chuàng)建一個(gè)默認(rèn)的有戶(hù)界面。
所有的DTS自定義任務(wù)執(zhí)行自定義任務(wù)接口。自定義的用戶(hù)接口是由兩個(gè)屬性,一個(gè)集合和一個(gè)方法:
1、 Name和Description屬性;
2、 Properties集;
3、 Execute方法。
所有的自定義任務(wù)應(yīng)該執(zhí)行屬性、屬性集和Execute方法。
編譯、注冊(cè)和安裝自定義任務(wù)
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());
}
}
}
}