我创建了一个将 excel 文件导入 SQL Server 表的 SSIS 包。
当我在我的机器上本地运行 SSIS 包时,它运行没有任何问题,但是当我在将安排包的服务器上运行它时,我收到以下错误(从文本文件我输出错误以使用 SSIS 日志记录)。
经过研究,我能找到的唯一建议是将 Run64BitRuntime 属性设置为 false,我这样做了,但仍然没有运气。我怀疑这是导致我的错误的原因,因为错误没有指定任何关于 64 位的内容(就像我发现的文章中的情况一样)。
我还认为可能是服务器没有适当的 Excel 驱动程序,但我不认为是这种情况,因为通常错误消息会说明驱动程序未注册。
我目前无权远程访问服务器。我只能将包上传到文件夹,然后由应用程序运行,所以我能看到的唯一错误消息是我创建的文本错误日志中的内容。
错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。对连接管理器“Envision”的 AcquireConnection 方法调用失败,错误代码为 0xC0209303。在此之前可能会发布错误消息,其中包含有关 AcquireConnection 方法调用失败原因的更多信息。
“Envision”是我的 Excel 连接管理器的名称。
我使用表达式填充 Excel 文件路径和连接字符串。
连接字符串表达式如下所示:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ @[User::SourceFilePath] +";Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";"
SSIS Pacakge 由 Windows 用户名/帐户执行。我认为它可能是一个网络服务帐户。(BDS_sprtIIS)
有没有人有任何解决方案或建议来解决这个包的问题,这个问题只能在我的本地机器上工作,而不是在包将被部署到的实际服务器上?
我在另一个论坛上找到了以下答案,这可能是导致我的问题的原因吗?他们基本上是说 Excel 连接管理器出于某种原因尝试访问用户临时文件夹,如果它无权访问该文件夹,那么它将失败:
我还注意到 Microsoft.JET.OLEDB.4.0 驱动程序将尝试读取登录用户配置文件下的临时目录。
.
...我们使用较低级别的域帐户运行我们的 SQL 代理,并使用代理帐户运行我们的 SSIS 包。你是正确的,因为 Procmon 也为我证实了这一点。我将代理帐户权限授予配置文件的临时目录(C:\Documents and Settings\SQLAgentDomainAccount\Local Settings\Temp)并且它有效!
我没有使用 SQL Server 作业或代理帐户。该程序包很可能由 Windows 帐户通过命令行脚本简单地执行。
Windows 帐户可以访问该文件,但我不确定它是否可以访问它的“TEMP”文件夹(我从未在包中引用它,所以我不知道为什么它需要访问该文件夹) ...
有 2 个问题阻止程序包在服务器上运行。以下是我发现的 2 个问题和解决方案。
默认情况下,该程序包由使用 64 位 DTexec 实用程序的应用程序执行,但该程序包需要使用该实用程序的 32 位版本运行,才能通过 Excel 连接管理器正确访问 Excel 文件。
我创建了一个“包装器”SSIS 包,它使用调用 32 位(而不是 64 位)DTExec 实用程序的执行进程任务并传递命令以打开原始包。
我还需要安装 32 位版本的Microsoft Access Database Engine 2010 Redistributable。
延伸阅读:
Microsoft.ACE.OLEDB.12.0 未注册(堆栈溢出)
安装 32 位访问引擎并在 32 位模式下运行对我有用!