1. 目标 www.yestar2000iTbulo.comWp3XQ
  MS SQL Server做大数据量传输的时候,我们大多会用到数据传输服务。现在假设,在开发环境下,我们已经设计好了DTS包并且运行良好,接下来我们要做的事情是迁移和部署这个DTS数据包。www.yestar2000iTbulo.comWp3XQ
  所以,我们需要把设计环境下的DTS包保存成结构化的存储文件,并且这个文件导入到目标环境下的MS SQL Server中,最后添加作业,让MS SQL Server Angent在我们预期的事情执行这个DTS包完成数据传输工作。其中需要重点解决的一个问题是,在目标环境中,DTS传输的源和目的地会发生改变,需要对它进行配置。 www.yestar2000iTbulo.comWp3XQ
  2. 解决方案 www.yestar2000iTbulo.comWp3XQ
  2.1. DTSRun www.yestar2000iTbulo.comWp3XQ
  DTSRun是微软提供的命令用于执行DTS包(包括结构化存储的、存储在SQL Server或存储在Meta Data Services的包)。 www.yestar2000iTbulo.comWp3XQ
  dtsrun的用法: www.yestar2000iTbulo.comWp3XQ
| 
 | 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]
 ]
 | 
www.yestar2000iTbulo.comWp3XQ  具体的用法参看微软的资料。这里需要重点指出的是,通过“/A global_variable_name:typeid=value”选项,我们可以给DTS包传递多个自定义的参数,在DTS包部署的目标环境下,我们用这个选项告诉DTS包服务器名称、用户名、密码等数据库连接信息。通过“/!Y”选项可以获取加密后的DTSRun参数。 www.yestar2000iTbulo.comWp3XQ
  2.2. 重新设计DTS包 www.yestar2000iTbulo.comWp3XQ
  为了处理DTSRun传入的自定义参数,DTS包需要重新设计。我们可以增加一个ActiveX Script任务,在ActiveX Script任务中通过VB Script或者Java Script对DTS编程,并且定义流程,把ActiveX Script任务设置成最开始的一个任务。由于DTS COM对象线程模式与ActiveX Script任务宿主的不一致,需要将ActiveX Script任务工作流属性设置成在主包线程中执行,否则可能会出现调用错误。 www.yestar2000iTbulo.comWp3XQ
  下面的例子是ActiveX Script任务中的脚本。例子中的DTS包包含名称为"DBConnection"的数据库连接对象。 www.yestar2000iTbulo.comWp3XQ
| 
 | '************************************************************************ '  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")www.yestar2000iTbulo.comWp3XQ
   ' 配置数据源对象的数据连接信息If bDBUseTrusted Then
 oConnection.UseTrustedConnection = bDBUseTrusted
 Else
 oConnection.UserID = sDBUserID
 oConnection.Password = sDBPassword
 End Ifwww.yestar2000iTbulo.comWp3XQ
 | 
www.yestar2000iTbulo.comWp3XQ
| 
 |   oConnection.DataSource = sDBDataSourceoConnection.Catalog = sDBCatalog
 Set oConnection = nothingwww.yestar2000iTbulo.comWp3XQ
   ' 配置跟多的信息,这里是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 Functionwww.yestar2000iTbulo.comWp3XQ
 | 
www.yestar2000iTbulo.comWp3XQ  2.3. 保存为结构化的存储文件 www.yestar2000iTbulo.comWp3XQ
  这个过程相当的简单,通过企业管理器可以完成。另存为的结构化存储文件就是我们要分发的DTS包。 www.yestar2000iTbulo.comWp3XQ
  2.4. 导入到MS SQL Server www.yestar2000iTbulo.comWp3XQ
  我们需要通过DTS编程来实现这个过程。需要强调的是,下面这段示例需要在ApartmentState为STA线程中才可以正确的被调用。 www.yestar2000iTbulo.comWp3XQ
| 
 |   public void Go(){
 DTS.Package2Class pkg = new DTS.Package2Class();
 DTS.Application app = new DTS.ApplicationClass();www.yestar2000iTbulo.comWp3XQ
   //从SQL SERVER中删除已经存在的同名DTS包try
 {
 pkg.RemoveFromSQLServer(
 DBServer,
 DBSUserID,
 DBSPassword,
 DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_Default,
 "", www.yestar2000iTbulo.comWp3XQ
 | 
www.yestar2000iTbulo.comWp3XQ
| 
 |   "",PkgName
 );
 }
 catch
 {
 }www.yestar2000iTbulo.comWp3XQ
   //取得待分发DTS包(结构化的存储文件)的包信息,这里假定包中只包含一个版本DTS.SavedPackageInfos infos = pkg.GetSavedPackageInfos(UNCFile);
 DTS.SavedPackageInfo info = infos.Item(1);www.yestar2000iTbulo.comWp3XQ
   object obj1 = null;object obj2 = null;
 string sPkgID = info.PackageID;
 string sVerID = info.VersionID;
 string sPkgName = info.PackageName;www.yestar2000iTbulo.comWp3XQ
   //载入结构化的存储文件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();www.yestar2000iTbulo.comWp3XQ
 | 
www.yestar2000iTbulo.comWp3XQwww.yestar2000iTbulo.comWp3XQ
| 
 |   //检查是否保存成功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();      www.yestar2000iTbulo.comWp3XQ
   mPkgID = inf.PackageID;mVerID = inf.VersionID;
 }www.yestar2000iTbulo.comWp3XQ
 | 
www.yestar2000iTbulo.comWp3XQ  2.5. 添加作业 www.yestar2000iTbulo.comWp3XQ
  添加作业可以用传统的方式,用SQL语句可做到,不做详细说明。MS SQL Server更是提供一系列的存储过程对作业进行修改,以达到用户预期的效果。www.yestar2000iTbulo.comWp3XQ
  3. 小结 www.yestar2000iTbulo.comWp3XQ
  文章到此已经达到我们的目标。总体上说,2.2这步的实现有些困难,在实现过程当中也碰到过很多困难,有一些是在新闻组中得到的解答,其它的步骤查看MSDN都可以得到比较容易的解决。www.yestar2000iTbulo.comWp3XQ