以编程方式访问 DTS 包转换
本文关键字:转换 包转换 DTS 编程 方式 访问 | 更新日期: 2023-09-27 18:30:32
>问题:
如何以编程方式从 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 对象模型,但它没有提供太多帮助,我找到的大多数资源仅涉及如何动态创建 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 包)。
对于所有在查找此内容之后的人:要获取任何子进程(如 ActiveX 脚本或 DTSTransformations),您必须获取任务,检查其自定义任务 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);
}