这是我第一次在SQL Server 2012中使用SSIS。我可以成功读取excel文件并将其内容加载到SQL Server 2012中的表中。该任务是一个简单的直接读取excel文件然后复制到sql server暂时没有验证或转换。任务很成功。但是当我试图让包从变量而不是原始的硬编码中读取文件名时,它产生了一个错误“DTS_E_OLEDBERROR。发生了OLE DB错误。错误代码:0x80040E4D”
我所做的只是用一个表达式替换excel连接管理器中的硬编码连接字符串,该表达式获取由表达式指定的变量的值
在数据流任务开始之前为变量分配了值。检查变量并确实具有正确的值。
但是下面的错误是在数据流任务开始时生成的。
如果有人能指出我做错了什么并告诉我如何解决问题,我们将非常感激。
答案 0 :(得分:28)
Excel连接管理器的ConnectionString
属性不是我操作当前文件的地方,这与普通的平面文件连接管理器形成对比。
而是将表达式放在Excel连接管理器的ExcelFilePath
属性中。
理论上,ConnectionString和ExcelFilePath之间应该没有区别,除了你有更多的东西"构建以获得恰到好处的连接字符串。
另外,请确保以32位模式执行包。
您可能遇到的另一种方法是,连接字符串的设计时值一旦运行就无效。当程序包开始时,它会验证所有预期的资源是否可用,如果它们不是,它会快速失败而不是在负载中死亡。您可以延迟此验证,直到SSIS必须实际访问资源为止,并通过将DelayValidation
属性设置为True来执行此操作。此属性存在于SSIS中的所有内容中,但我首先要在Excel连接管理器上进行设置。如果仍然会引发程序包验证错误,请尝试将数据流的延迟验证设置为true。
答案 1 :(得分:1)
即使按照所有说明进行操作,我也有一段时间尝试使其工作,所以我只是使用静态excel名称对其进行了保存,并添加了“文件系统任务”来复制文件并创建一个新文件。我需要的任何名称的文件。
答案 2 :(得分:1)
我们可以像下面的表达式中那样定义连接字符串:
Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=" + @[User::InputFolder] + "\\"+ @[User::FileName] +";
Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";