问题:
如何以编程方式从 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 包)。