用DTS方式实现数据导入导出操作

来源:互联网 发布:古典音乐唱片淘宝网 编辑:程序博客网 时间:2024/06/01 20:26

经常遇到批量数据导入问题,比如要定时把某一个目录中的所有EXCEL文件导入数据库,如果采用DTS导入方式,将很方便和快捷的处理好!

我以实际工作中一个用DTS导入例子详细讲解下,希望对大家对DTS导入方式有一个认识。

/*
有疑问可以联系:zlp321001@hotmail.com

*/

/*
环境:数据库 SQL2000个人版 Office 2003
操作系统:Window 2000

本范例实现:某一个目录中一个Excel文件中数据导入多个表的功能,

                       可以扩充为某一个目录中所有Excle 文件定时导入到数据库中
*/

--A:首先:建包

展开SQL组->展开服务器->数据转换服务->本地包->右边栏目新建包

--B:然后建立包转换过程

1:数据源连接:

连接->Microsoft Excel 97-2000->输入:ExcelFile,选择默认数据源,本测试路径(D:/SZDATA/ExcelData/AppraiseData.xls)

2:数据目的连接:

连接->Microsoft OLE DB Provider for SQL Server -配置要导入目的数据库中的环境(略)

3:设置数据转换

任务->转换数据任务->连接ExcleFile 和 SQLSERVER->双击转换数据任务属性->

源:
选择SQL查询->输入 Select * from [sheet1$] (默认Excel 文件,可以根据自己环境更改)->此时可以用参数过滤要导入Excle数据条件,如:select * from [sheet1$] where STCD=? and TYPE=?,然后参数化两个参数,创建全局变量(很多地方均有相关介绍,略)

目的:
选择要导入的表

转换:
此时可以看到Excle 字段和数据库的对应关系。新建->数据转换的方式如下:(ActiveX script 、Copy Column、DateTime String、LowerCase string、Middle of String、等相关方式,笔者采用ActiveeXScript 方式)->选择源列(Excle 列)和目的列(数据库字段)之间导入关系->常规->属性-SQLSever此时给你生成基本的(Java 转换脚本)改脚本实现导入数据转换功能,如果您对脚本比较熟悉,可以自己添加自己想要的功能,如果不够熟悉,请务删除和添加该类脚本。然后确定->确定

查找:

选项:
主要用于生成导入日志文件,用户可以自定义

确定->完成

注意:该过程是把Excle的数据导入一个表中,由于笔者是把一个Excel文件导入7张表中,非一对一的关系,所以笔者需要重复上面的操作,配置好其它6个任务。略.


--C:创建全局变量
由于Excel文件名、服务器名、数据库名、文件路径均是一个变化的,所以必须要为该变量赋予参数化(全局变量参数化)
1:添加全局变量
右击包属性->全局变量->新建(名称:FileName、SeverName、DataBaseName)
                                                     (数据类型:String) (值:NULL)
如果要给Excel过滤导入数据,此时候为它也创建一个全局变量->确定

--D:全局变量参数化
1:为Excel参数化
任务->动态属性任务->输入描述信息:(SetParameters)->添加->ExcelFile->DataSource(双击)->源->选择全局变量->变量->FileName->确定
2:为数据库参数化
添加->连接->SQL Server->双击DataSource->源->选择全局变量->ServerName->确定
添加->连接->SQL Server->双击Catalog->源->选择全局变量->DataBaseName->确定

3:全局参数化完成


--E:添加工作流
SQL可以为每一个过程添加工作流,处理所有转换过程中出现的意外
本例子均采用成功时,其它工作流雷同。(如导入失败可以,发Email通知等相关操作)

选择动态属性任务和ExcelFile 用成功时连

--F:数据库中日志处理
DTS过程中的日志,可以用一个日志表记录,详细可以查看导入数据情况

任务->SQL任务->然后用SQLServer 与SQL任务建立一个成功时的工作流

双击SQL任务属性:添件记录SQL语句如:
INSERT
INTO LogTable
      (Status)
VALUES (?)
注意:?表示参数化,选择参数,为它选择一个全局变量,参数化。确定,完成

--所有配置完成,生成图如下:


---所有配置做完后,现在就是调用它:

笔者介绍三种调用方式:

A:命令
开始:dtsrunui (有向导,按照向导,为每一个参数赋予值,就可以了)一般用于测试

B:包调用
这个也有相关书籍介绍,笔者略

C:存储过程调用

CREATE PROCEDURE my_proc1 AS
EXEC master.dbo.xp_cmdshell 'dtsrun /S /E /N"水质项目监测数据导入" /A"ServerName":8= /A"FileName":8="D:/SZDATA/ExcelData/AppraiseData.xls" /A"DataSource":8="SZ"'
GO

笔者稍微说明下参数定义:
/S 服务器 /E 信任连接 /N 包名
/ ServerName: 为空 ,8:全局参数类型为字符
/A 表示全局变量

D:利用游标循环调用DTS

--包参数调用的另一种方式:
DECLARE @STCD varchar(10)
DECLARE STCDS_CURSOR CURSOR FOR
OPEN STCDS_CURSOR

FETCH NEXT FROM STCDS_CURSOR
INTO @STCD

WHILE @@FETCH_STATUS = 0
BEGIN
   --调用包代码
   EXEC('master.dbo.xp_cmdshell ''dtsrun /S /E /N"新建包" /A"STCD":3="'+@STCD+'"''')
   FETCH NEXT FROM STCDS_CURSOR
   INTO @STCD
END

CLOSE STCDS_CURSOR
DEALLOCATE STCDS_CURSOR
GO


E:.net调用方式:
//说明需要添加 Microsoft.SqlServer.DTSPkg80.Package2Class

    /// <summary>
    /// 运行DTS(Data Transformation Services )
    /// </summary>
    /// <returns></returns>
    public string runDTS()
    {
     try
     {
      string returnValue;

      Microsoft.SqlServer.DTSPkg80.Package2Class package = new Microsoft.SqlServer.DTSPkg80.Package2Class();
      string fileName = "C://DTStest.dts";
      string password =  null;
      string packageID = null;
      string versionID = null;
      string name = "DTStest";
      object pVerpersistStfOfHost = null;
      package.LoadFromStorageFile(fileName,password,packageID,versionID,name,ref pVerpersistStfOfHost);

      package.Execute();
      package.UnInitialize();
      package=null;
      returnValue = "success";
      return returnValue;

     }
     catch(Exception ex)
     {
      throw ex;
     }

    }