【问题标题】:Programmatic Access to DTS Package Transformations以编程方式访问 DTS 包转换
【发布时间】:2013-09-06 19:31:17
【问题描述】:

问题:

如何以编程方式从 DTS 包中读取转换,最好使用 C#,但 C++、VB.NET、Java、Python 或 SQL 过程也可以。

状态:

我目前有一些代码可以从文件中加载 DTS 包:

using System;

namespace ConceptSandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            String location = @"DTS.Old\GrindItemImport.dts";
            DTS.Package pkg = new DTS.Package();

            pkg.LoadFromStorageFile(location, null, null, null, null, null);
            Console.WriteLine("{0}: {1} Tasks", pkg.Name, pkg.Tasks.Count);
            for (Int32 i = 1; i <= pkg.Tasks.Count; i++)
            {
                for (Int32 j = 1; j <= pkg.Tasks.Item(i).CustomTask.Properties.Count; j++)
                {
                    Console.WriteLine("\t{0}: {1}", pkg.Tasks.Item(i).CustomTask.Properties.Item(j).Name, pkg.Tasks.Item(i).CustomTask.Properties.Item(j).Value);
                }
            }

            Console.ReadKey(true);
        }
    }
}

但是,我似乎无法深入(或向上)进行转换。我查看了DTS object model,但它并没有提供太多帮助,而且我发现的大部分资源仅涉及如何动态创建 DTS/SSIS 包而不是如何读取它们。

背景:

几年前,我工作的公司的一个部门对大量代码进行了大规模重构。在此过程中更改了一些数据类型,并且对数据类型范围的一些检查也丢失了。然后将此数据从该应用程序导出到我们的服务器并导入我们的数据库。数据流为:

Data Input->CSV Export->Network->CSV Load to Temp Table->Temp to Final Table

问题是导出现在导出的变量超出了数据库表的数据类型范围,这会导致使用 DTS/SSIS 包导入数据时失败。

我需要对应用程序使用的数据类型以及我们的数据库类型进行分析,以便确定解决这些问题所需的工作量。这是我目前进行此分析的地方:

  • 我可以从源中获取 CSV 文件名
  • 我可以从源获取CSV文件中的列名
  • 我可以将 CSV 文件中的列名链接到源文件中的变量名
  • 我可以获取源文件中变量的数据类型
  • 我可以获得从 CSV 文件到 SSIS 包的数据库表的映射。
  • 无法获取从 CSV 文件到 DTS 包的数据库表的映射。

如果我知道 CSV 文件中的哪一列映射到数据库表中的哪一列,那么我可以使用表模式来获取类型,然后将应用程序类型与表类型进行比较,以查看是否需要任何操作那个特定的文件/列/表。

仅供参考,目前仍有数百个 DTS 包在使用(最终我将使用修改后的相同流程来自动将这些 DTS 包转换为 SSIS 包)。

【问题讨论】:

    标签: c# sql-server-2008 sql-server-2005 dts


    【解决方案1】:

    对于所有寻找此内容的人:要获取任何子进程,例如 ActiveX 脚本或 DTSTransformations,您必须获取任务,检查其自定义任务 ID,然后使用该 ID 将其转换为适当的类型在您可以访问诸如 DTS 转换之类的东西之前,您可以访问 DTS 对象。我已经包含了我的沙盒项目中的代码,用于获取以下映射:

    static void Main(string[] args)
    {
        String location = @"DTS.Old\SomeDTSPackage.dts";
        DTS.Package pkg = new DTS.Package();
        DTS.Task task;
        DTS.DataPumpTask2 dataPumpTask;
        DTS.Transformation transform;
        DTS.Column source;
        DTS.Column destination;
    
        pkg.LoadFromStorageFile(location, null, null, null, null, null);
        Console.WriteLine("{0}", pkg.Name);
    
        Console.WriteLine("  TASKS");
        for (Int32 tsk = 1; tsk <= pkg.Tasks.Count; tsk++)
        {
            if (pkg.Tasks.Item(tsk).CustomTaskID == "DTSDataPumpTask")
            {
                dataPumpTask = (DTS.DataPumpTask2)pkg.Tasks.Item(tsk).CustomTask;
    
                Console.WriteLine("    TRANSFORMS");
                for (Int32 trans = 1; trans <= dataPumpTask.Transformations.Count; trans++)
                {
                    transform = dataPumpTask.Transformations.Item(trans);
                    for (Int32 col = 1; col <= transform.SourceColumns.Count && col <= transform.DestinationColumns.Count; col++)
                    {
                        source = transform.SourceColumns.Item(col);
                        destination = transform.DestinationColumns.Item(col);
                        Console.WriteLine("      {0} -> {1}", source.Name.PadRight(15, ' '), destination.Name);
                    }
                }
            }
        }
    
        Console.ReadKey(true);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2011-01-03
      • 2012-12-26
      相关资源
      最近更新 更多