在SSIS 2017中无法在excel连接管理器上使用表达式

时间:2018-10-30 18:22:00

标签: ssis

我试图遍历目录中的excel文件并在SSIS中执行数据流任务。

“每次循环”容器的设置似乎非常简单:

For-Each Loop

我映射到一个名为FileNameTemp的变量。

For-Each Loop 2

在每次循环中,我都有一个数据流任务,其中源对象是带有Excel Connection Manager的Excel Source。我使用FileName临时设置ExcelFileName的文件名:

Excel File Manager

我的问题是,每当我尝试运行程序包时,都会出现以下错误:

  

[连接管理器“ Excel连接管理器”]错误:SSIS错误代码   DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:   0x80004005。 OLE DB记录可用。资料来源:“ Microsoft Access   数据库引擎”结果:0x80004005描述:“失败创建   文件。”

我找到了其他类似的帖子。我绝对有权写入此文件夹。如果我删除该表达式,而只是一遍又一遍地打开相同的文件就可以。我还几乎在每个级别上都将DelayValidation设置为true。

2 个答案:

答案 0 :(得分:2)

尝试从表达式定义中删除“ C:...”。 For-Each文件枚举器将提供完整路径。

将来,您可以在数据流任务上设置一个断点,并查看在“本地”选项卡中设置的变量的值。

答案 1 :(得分:1)

相同的答案,比@mike Baron的答案更冗长的是,在ForEach循环容器中,单选按钮被选中为“完全合格”,结果被推入变量@[User::FileNameTemp]

在指定的源文件夹C:\ SourceCode \ ExcelSourceFinancialReconcilliation中找到的每个文件将依次以

的形式分配给该变量。
  • C:\ SourceCode \ ExcelSourceFinancialReconcilliation \ file1.txt
  • C:\ SourceCode \ ExcelSourceFinancialReconcilliation \ file2.csv
  • C:\ SourceCode \ ExcelSourceFinancialReconcilliation \ file2.xls

然后,当我们在Excel连接管理器的ExcelFilePath属性上设置表达式时,我们只需要使用@[User::FileNameTemp]就可以了,表达式使路径加倍,以便Excel尝试查找

C:\SourceCode\ExcelSourceFinancialReconcilliation\file1.txt\C:\SourceCode\ExcelSourceFinancialReconcilliation\file1.txt

通常,仅在SSIS中与“对象”相关的表达式中使用直接变量。 Property1 = @Variable这样做的原因是,您不能在评估上加上断点来确定@ Property1 =“ Foo” + @Variable为何无效。如果创建自定义变量@ Property1Variable =“ Foo” + @Variable,然后分配@ Property1 = @ Property1Variable,则可以在包中放置一个断点,然后检查SSIS变量的值。这样发现问题要容易得多。

关于该主题的其他答案可能很有帮助

https://stackoverflow.com/a/18640174/181965 https://stackoverflow.com/a/21536893/181965