45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:DTS用法介绍

DTS用法介绍

2016-09-04 06:23:01 来源:www.45fan.com 【

DTS用法介绍

//加入名称空间
using System.Data;
using System.Data.SqlClient;


//定义方法GetData(),返回一个数据表
private System.Data.DataTable GetData()
{
SqlConnection conn= new SqlConnection(@"Server=PXGD2;Initial Catalog=pingxiang;Uid=sa;Pwd=;");
SqlDataAdapter adapter= new SqlDataAdapter("select username 用户名,catalyst_port 占用端口,home_address 住宅地址,ip_address

ip地址,phone 电话,addtime 开通日期 from userinfo where catalyst_port=1 or catalyst_port=' order by ip_address desc",conn);

DataSet ds= new DataSet();
try
{
adapter.Fill(ds,"Customer");
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
return ds.Tables[0];
}

//按钮
private void button1_Click(object sender, System.EventArgs e)
{
Excel.Application excel= new Excel.Application();
int rowIndex=1;
int colIndex=0;

excel.Application.Workbooks.Add(true);

DataTable table=GetData();

//将所得到的表的列名,赋值给单元格
foreach(DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[1,colIndex]=col.ColumnName;
}

//同样方法处理数据
foreach(DataRow row in table.Rows)
{
rowIndex++;
colIndex=0;
foreach(DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[rowIndex,colIndex]=row[col.ColumnName].ToString();
}
}
//不可见,即后台处理
excel.Visible=true;
=================

2 远程处理框架和ADO.Net

开发分布式数据库系统需要解决的两个重要问题是:各场地间的数据通信以及对数据库的操作及管理。使用C#结合ADO.Net能够高效、可靠地解决这两方面的问题。具体表现为,在C#中通过使用.Net远程处理框架能够方便地解决数据、命令远程传递问题;C#通过ADO.Net对数据库进行操作,使分布式数据库系统中对数据库的各种操作变得高效、可靠,同时易于解决数据一致性问题。

2.1 .Net远程处理框架

实现数据和命令的远程传递有三种方式。第一种是使用报文或消息的方式,把要传送的数据转化为流格式,再通过套接字编程用报文的形式发送到远程主机。此种方法麻烦,不易实现。第二种是使用Web Service,即各远程主机提供一个数据库查询服务的Web Service。这种方式只能对单个场地进行查询,无法实现多场地的联合查询。第三种是使用.Net远程处理框架(.Net Remoting Framework)技术,它将远程调用的技术细节隐藏起来,服务程序只需通过简单的设置就可以把本地对象变成为远程提供服务的远程对象,客户端可以像访问本地对象一样透明地访问远程对象,所有的消息、报文等都交给.Net Remoting对象处理,大大简化了开发。远程处理的一般过程如图1所示:

DTS用法介绍

图1 远程处理过程

首先,服务器端创建一个服务器类的实例,远程处理系统创建一个表示该类的代理对象,并向客户端对象返回一个对该代理的引用。当客户端调用方法时,远程处理基础结构连接检查类型信息,并通过信道将该调用发送到服务器进程。侦听信道获得该请求并将其转发给服务器远程处理系统,服务器远程处理系统查找(或在必要时创建)并调用被请求的对象。然后,此过程将反向进行,服务器远程处理系统将响应捆绑成消息并由服务器信道发送到客户端信道。最后,客户端远程处理系统通过代理将调用的结果返回给客户端对象。

2.2 ADO.Net

ADO.Net以XML为核心,是.Net数据库应用程序的解决方案。它使用离线数据结构,数据源中的数据被缓存到数据集(DataSet)对象中,用户无须锁定数据源,数据以XML格式保存。

2.2.1 ADO.Net管理数据一致性

在分布式数据库系统中,很可能出现多个用户同时访问和修改数据的情况,因此,对于分布式数据库系统,数据一致性是不可或缺的。ADO.Net通过使用乐观一致性方案来控制数据一致性(实际上DataSet对象被设计成支持使用乐观一致性控制机制),即数据行只有在数据库中真正被更新时才会被锁定,而在悲观一致性方案中,数据行在从被提取出来到在数据库中更新这段时间内一直被锁定。因此,使用ADO.Net能够在更少的时间内响应数量巨大的用户。

另外,在分布式数据库系统中,还会经常遇到当用户修改自从提取出来以来已经被修改的行时,违反一致性原则。对此问题ADO.Net也作了很好地解决,即使用DataSet对象为每一条修改过的记录维护两个版本:原始版本和更新版本,在更新的记录被写回数据库之前,先要把数据集中记录的原始版本与数据库中的当前版本进行比较,如果两个版本匹配,就在数据库中更新记录;否则,就会出现违反一致性原则的错误。

 

3 实例开发

一个家用电器连锁店设有一个总部和许多分店,总部和分店以及各分店之间经常需要进行各种信息的查询(如:商品当日价目表、各店销售状况和库存信息等),对此组织机构建立分布式数据库查询系统,可实现总部和各店信息的共享,便于统一管理。

3.1 系统设计

3.1.1系统结构图

系统结构如图2所示:

DTS用法介绍
图2 系统结构图

总部和各分店都配置了一台具有固定IP的服务器,其它电脑通过集线器与服务器相连,总部和各分店的服务器通过通信网络联接起来。

3.1.2 系统实现步骤

系统实现分为三个主要步骤。首先,为总部和各分店设计数据库。由于数据量较大,故采用SQL Server为每个分店创建销售和库存数据库,同时为总部创建员工数据库、整个连锁店的存货数据库、信用卡客户数据库以及供应商信息数据库等。其次,需要建立一个提供数据库服务(DbServer)的动态链接库(dll),将查询时所要用到的一些服务(如:远程对象的发布和获取等)和函数(如:本地异地数据表的查询、数据表的远程创建和删除、表间的连接和合并等)置入该dll中,各分店都需要使用这个dll,以便查询时对一些服务和函数进行调用。最后,根据实际需要开发客户端查询界面。

3.2系统实现的关键技术

3.2.1 远程对象的发布与获取

系统运行后所要做的第一个工作是发布本地的远程对象并获取其它各店所发布的远程对象。发布远程对象时,首先要设置一个网络端口号,然后创建并注册一个通道,最后发布该服务器端的激活对象。其它场地的服务器根据IP地址和网络端口号即可方便地获取所发布的远程对象。实现远程对象发布和获取的关键代码如下:

远程对象的发布:

//创建一个通道实例,port为指定的网络端口号
TcpChannel MyChannel= new TcpChannel (Int32.Parse(port));
//注册通道
ChannelServices.RegisterChannel(MyChannel);
//发布该服务器端激活对象
RemotingConfiguration.RegisterWellKnownServiceType( typeof ( DbServer ), "STORE", WellKnownObjectMode.Singleton);
远程对象的获取:
//根据IP地址和端口号获取相应的远程对象
try
{myDbServer=(DbServer)Activator.GetObject(typeof(DbServer),"tcp://"+ip+":"+p+"/STORE"); }
//捕捉异常
catch( NullReferenceException nullExp )
{MessageBox.Show( "指定的url地址不可到达 " + nullExp.Message );}
catch( RemotingException remExp )
{MessageBox.Show( "指定获得的对象定义不对" + remExp.Message );}

3.2.2数据库的访问

通过ADO.Net访问数据库,可以方便地连接数据库,将数据源中的数据导入DataSet对象中,在DataSet对象中可对数据表进行各种操作,而且DataSet对象本身也可远程传递。这为开发分布式数据库系统带来极大方便。实现数据库访问的关键代码如下所示:

//建立数据库的连接
string SqlConn = "Initial Catalog=Store;Data Source=Localhost;Userid=sa;Password=;";
SqlConnection Conn= new SqlConnection
(SqlConn);
Conn.Open();//打开数据库
//将数据源中的数据导入到数据集对象
try{
DataSet ds = new DataSet();
DataTable dt=new DataTable("Result");
SqlDataAdapter adapter=new SqlDataAdapter();
SqlCommand mySqlDataSetCmd =new SqlCommand
(CmdString,Conn);//CmdString为要执行的命令
adapter.SelectCommand= mySqlDataSetCmd;
adapter.Fill(dt);
ds.Tables.Add(dt); }
finally
{ Conn.Close();//关闭数据库的连接}

3.2.3 查询

分布式数据库系统中的查询一般分为三类:本地查询、远程查询和联合查询。本地查询和集中式数据库的查询没什么区别;对于远程查询,只要获取远程对象后,调用查询函数,即可方便地实现;最复杂的是联合查询,涉及到多场地之间数据的查询、表的远程创建、传递、连接、合并等技术。下面以实例介绍联合查询的实现。

第二连锁店要查询离其较近的第三、第四连锁店中所有北京的供应商所供应的空调的库存信息以便调货,可通过以下步骤实现。首先,获取总部以及第三、第四连锁店所发布的远程对象。接着,通过远程对象在总部创建一临时数据表t1,将查询到的所有北京的供应商信息存放在t1表中(各分店只有供应商名,并不知其所在地,只有总部才有供应商的详细信息),再将t1表保存到第三和第四连锁店。然后让t1表分别与两店的库存表作连接,找出所有北京供应商所供应的空调库存信息(如空调名称、型号、个数、价格等信息),并将连接结果t2和t3数据表返回到第二连锁店。最后对t2和t3两表进行合并,并使用DataGrid控件显示出来。上述实现中,包含了不同场地之间数据表的复制、传递、连接等,所用到的一些函数(如:远程创建数据表、表与表间的远程连接、合并等)都放在dll中,可以方便地调用。

4 结束语

利用C#的.Net Remoting技术能够方便地解决各场地间数据的通信问题。另外,C#通过ADO.Net访问数据库,使得对数据库的操作及管理变得更加高效、可靠。这两种技术的使用,有效地解决了开发分布式数据库系统的主要问题,大大减轻了系统开发工作量,并且提高了系统的可靠性和安全性
=============================================
本文描述了如何利用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());
}
}
}

}
==============================================
二、SQLServer和Excel


1、向Excel查询

select * from OpenRowSet(’’microsoft.jet.oledb.4.0’’,’’Excel
8.0;HDR=yes;database=c:/book1.xls;’’,’’select * from [Sheet1
$]’’) where c like ’’%f%’’

select * from
OPENROWSET(’’MICROSOFT.JET.OLEDB.4.0’’
,’’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:/book1.xls’’,[sheet1$])

1)hdr=yes时可以把xls的第1行作为字段看待,如第1个中hdr=no的话,where时
就会报错
2)[]和美圆$必须要,否则M$可不认这个账

2、修改Execl

update OpenRowSet(’’microsoft.jet.oledb.4.0’’,’’Excel
8.0;hdr=yes;database=c:/book1.xls;’’,’’select * from [Sheet1
$]’’)
set a=’’erquan’’ where c like ’’%f%’’

3、导入导出


insert into OpenRowSet(’’microsoft.jet.oledb.4.0’’,’’Excel
8.0;hdr=yes;database=c:/book1.xls;’’,’’select * from [Sheet2
$]’’)(id,name)
select id,name from serv_user

或BCP

master..xp_cmdshell’’bcp "serv-htjs.dbo.serv_user"
out"c:/book2.xls" -c -q -S"." -U"sa" -P"sa"’’

从Excel向SQLServer导入:

select * into serv_user_bak
from OpenRowSet(’’microsoft.jet.oledb.4.0’’,’’Excel
8.0;HDR=yes;database=c:/book1.xls;’’,’’select * from [Sheet1
$]’’)

如果表serv_user_bak不存在,则创建

有关BCP和分布式查询的详细解答,就查SQLServer自带的帮助吧。
SQLServer和txt文件、HTML文件、VFP文件的数据交换都显得非常容易
了。。。。
 

本文地址:http://www.45fan.com/dnjc/71967.html
Tags: 学习 名称 DTS
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部