数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
MS SQL Server 2000数据转换服务部署

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

1. 目标

MS SQL Server做大数据量传输的时候,我们大多会用到数据传输服务。现在假设,在开发环境下,我们已经设计好了DTS包并且运行良好,接下来我们要做的事情是迁移和部署这个DTS数据包。所以,我们需要把设计环境下的DTS包保存成结构化的存储文件,并且这个文件导入到目标环境下的MS SQL Server中,最后添加作业,让MS SQL Server Angent在我们预期的事情执行这个DTS包完成数据传输工作。其中需要重点解决的一个问题是,在目标环境中,DTS传输的源和目的地会发生改变,需要对它进行配置。

2. 解决方案

2.1. DTSRun

DTSRun是微软提供的命令用于执行DTS包(包括结构化存储的、存储在SQL Server或存储在Meta Data Services的包)。

dtsrun的用法:

dtsrun
[/?]|
[
    [
        /[~]S server_name[\instance_name]
        { {/[~]U user_name [/[~]P password]} | /E }
    ]
    {    
        {/[~]N package_name }
        | {/[~]G package_guid_string}
        | {/[~]V package_version_guid_string}
    }
    [/[~]M package_password]
    [/[~]F filename]
    [/[~]R repository_database_name]
    [/A global_variable_name:typeid=value]
    [/L log_file_name]
    [/W NT_event_log_completion_status]
    [/Z] [/!X] [/!D] [/!Y] [/!C]
]

具体的用法参看微软的资料。这里需要重点指出的是,通过“/A global_variable_name:typeid=value”选项,我们可以给DTS包传递多个自定义的参数,在DTS包部署的目标环境下,我们用这个选项告诉DTS包服务器名称、用户名、密码等数据库连接信息。通过“/!Y”选项可以获取加密后的DTSRun参数。

2.2. 重新设计DTS包

为了处理DTSRun传入的自定义参数,DTS包需要重新设计。我们可以增加一个ActiveX Script任务,在ActiveX Script任务中通过VB Script或者Java Script对DTS编程,并且定义流程,把ActiveX Script任务设置成最开始的一个任务。由于DTS COM对象线程模式与ActiveX Script任务宿主的不一致,需要将ActiveX Script任务工作流属性设置成在主包线程中执行,否则可能会出现调用错误。

下面的例子是ActiveX Script任务中的脚本。例子中的DTS包包含名称为"DBConnection"的数据库连接对象。

'************************************************************************
'  Visual Basic ActiveX Script
'************************************************************************

Function Main()
    Dim sDBDataSource
    Dim sDBCatalog
    Dim sDBUserID
    Dim sDBPassword
    Dim bDBUseTrusted
    Dim sOLAPServer
    Dim sOLAPCatalog
    Dim oPackage
    Dim oConnection
    Dim oTask
    Dim oCustomTask
    
    ' 获取DTSRun传入的自定义参数
    sDBDataSource = DTSGlobalVariables("DBDataSource").Value
    sDBCatalog = DTSGlobalVariables("DBCatalog").Value
    sDBUserID = DTSGlobalVariables("DBUserID").Value
    sDBPassword = DTSGlobalVariables("DBPassword").Value
    bDBUseTrusted = DTSGlobalVariables("DBUseTrusted").Value
    sOLAPServer = DTSGlobalVariables("OLAPServer").Value
    sOLAPCatalog = DTSGlobalVariables("OLAPCatalog").Value
    
    ' 取得当前DTS包对象的技巧
    Set oPackage = DTSGlobalVariables.Parent
    ' 取得包中的数据连接对象
    Set oConnection = oPackage.Connections("DBConnection")

    ' 配置数据源对象的数据连接信息
    If bDBUseTrusted Then
        oConnection.UseTrustedConnection = bDBUseTrusted
    Else
        oConnection.UserID = sDBUserID
        oConnection.Password = sDBPassword
    End If
    oConnection.DataSource = sDBDataSource
    oConnection.Catalog = sDBCatalog
    Set oConnection = nothing

    ' 配置跟多的信息,这里是OLAP分析服务处理任务
    Set oTask = oPackage.Tasks("DTSTask_DTSOlapProcess.Certificate")
    Set oCustomTask = oTask.CustomTask
    Set oTask = nothing
    oCustomTask.Properties("TreeKey").Value = sOLAPServer & "\" _ 
        & sOLAPCatalog & "\CubeFolder\Certificate"
    Set oCustomTask = nothing
    
    ' 返回成功状态
    Main = DTSTaskExecResult_Success
End Function

2.3. 保存为结构化的存储文件

这个过程相当的简单,通过企业管理器可以完成。另存为的结构化存储文件就是我们要分发的DTS包。

2.4. 导入到MS SQL Server

我们需要通过DTS编程来实现这个过程。需要强调的是,下面这段示例需要在ApartmentState为STA线程中才可以正确的被调用。

public void Go()
{
    DTS.Package2Class pkg = new DTS.Package2Class();
    DTS.Application app = new DTS.ApplicationClass();

    //从SQL SERVER中删除已经存在的同名DTS包
    try
    {
        pkg.RemoveFromSQLServer(
            DBServer, 
            DBSUserID, 
            DBSPassword, 
            DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_Default,
            "", 
            "",
            PkgName
        );
    }
    catch
    {
    }

    //取得待分发DTS包(结构化的存储文件)的包信息,这里假定包中只包含一个版本
    DTS.SavedPackageInfos infos = pkg.GetSavedPackageInfos(UNCFile);
    DTS.SavedPackageInfo info = infos.Item(1);

    object obj1 = null;
    object obj2 = null;
    string sPkgID = info.PackageID;
    string sVerID = info.VersionID;
    string sPkgName = info.PackageName;

    //载入结构化的存储文件
    pkg.LoadFromStorageFile(
        UNCFile, 
        PkgPwd, 
        sPkgID, 
        sVerID, 
        sPkgName, 
        ref obj1
    );
    //保存到SQL Server中
    pkg.SaveToSQLServerAs(
        PkgName, 
        DBServer, 
        DBSUserID, 
        DBSPassword, 
        DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_Default, 
        PkgOwnerPwd, 
        PkgOperatorPwd, 
        "", 
        ref obj2, 
        false); 
    pkg.UnInitialize();

    //检查是否保存成功
    DTS.PackageSQLServer pkgSQLServer = 
        app.GetPackageSQLServer(
            DBServer, 
            DBSUserID, 
            DBSPassword,
            DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_Default
        );
    
    DTS.PackageInfos infs = 
        pkgSQLServer.EnumPackageInfos(PkgName, true, "");
    if (infs.EOF)
        throw new Exception("DTS包导入到数据库失败。");
    DTS.PackageInfo inf = infs.Next();      

    mPkgID = inf.PackageID;
    mVerID = inf.VersionID;
}

2.5. 添加作业

添加作业可以用传统的方式,用SQL语句可做到,不做详细说明。MS SQL Server更是提供一系列的存储过程对作业进行修改,以达到用户预期的效果。

3. 小结

文章到此已经达到我们的目标。总体上说,2.2这步的实现有些困难,在实现过程当中也碰到过很多困难,有一些是在新闻组中得到的解答,其它的步骤查看MSDN都可以得到比较容易的解决。




相关文章

相关软件