0

我正在开发一个 SSIS 包,它使用 for each 循环遍历目录中的 excel 文件和导入它们的数据流任务。

我遇到的问题是与我一起工作的项目经理并不认为用户会始终遵循该结构。因此,如果一个文件在文件夹中,并且包尝试导入它,但电子表格缺少列或它生成的额外列,当然会出错。即使我将任务设置为不使包失败;该包确实失败了,然后其他文件没有被导入。

所以,我想知道确定电子表格格式不正确或阻止错误导致包执行失败的最简单方法是什么?采取上述步骤后,我将使用文件复制任务将文件移动到“失败”文件夹。然后继续处理电子表格。

4

3 回答 3

2

我有一个与您的类似的 SSIS 包设置,除了它遍历 Microsoft Project 文件列表并将记录导入数据库。在 Foreach 循环容器中,它首先执行检查以查看文件是否存在。我将 FileName 的字符串变量和布尔变量 bolFileExists 传递给脚本。我知道您也在寻求验证文件格式是否正确,并且我猜测您可能能够应用类似于以下脚本任务代码的内容:

    public void Main()
    {
        if (File.Exists(Dts.Variables["FileName"].Value.ToString()) )
        {
            Dts.Variables["bolFileExists"].Value = true;
        }
        else
        {
            Dts.Variables["bolFileExists"].Value = false;
        }
    }

以此为导向将有两条路径。第一个将应用表达式“@bolFileExists==True”,然后执行导入过程。另一个将应用表达式“@bolFileExists==False”并跳过该文件并允许处理以下文件。在我的表驱动的 SSIS 包中,对于这两个选项,导入状态是在列出正在导入的文件的表中定义的。我有近 40 个文件被导入,这使我可以运行查询以确定是否遗漏了任何文件,并在流程完成后发送的自动电子邮件中应用该查询。

至于不正确的格式,我的第一个建议是为用户提供一个模板,以便他们遵循其中一个工作表中的说明。之后,您可以尝试应用一个临时表或 SQL 来收集感兴趣的工作表中包含的列的列表或计数。您在此处采用的方法取决于所提取信息的复杂性。同样在我的 SSIS 包中,数据在导入后仍然可以关闭。在这种情况下,我首先将导入到一个临时登台表中,在该表中执行检查,然后使用 MERGE 将符合感兴趣标准的内容规范化到最终目标表中。

如果您有任何问题,请告诉我。希望这有助于解决部分问题。

于 2012-12-12T23:00:39.050 回答
0

如果您正在谈论验证列的准确性等,您可以有一个脚本任务来打开 excel 文件并查看每一列以验证内容是否正确。这可以使用 OpenXML 或 InterOp.Office 参考来完成。

如果您在谈论 excel 版本,您可以有一个查看文件扩展名的脚本任务(尽管如果他们重命名文件,这真的无济于事)。

于 2012-12-13T15:06:55.617 回答
0

有 35 篇关于 SO 的文章引用了底层数据库架构: https ://stackoverflow.com/search?q=GetOleDbSchemaTable

尝试使用模式检测步骤来丰富 Kosh 的脚本,在该步骤中,您将使用与 XLS 文件的底层连接作为 OleDB 源。提取字段列表后,您可以验证所有必要字段是否以正确的顺序出现。

于 2012-12-13T07:09:07.857 回答