我在这个错误上挣扎了很长时间。
这是我的项目的配置:
目标:使用项目参数创建动态 Excel 连接管理器,以将 SQL 请求中的数据提取到 Excel 文件。
通过 SERV_FILE 上的文件的静态值,我的包工作得很好并加载了这个 excel 文件。无论我在本地还是在 SERV_SSIS_CATALOG 上执行包,它都可以工作。
当我尝试为
ExcelFilePath
创建表达式时,无论我做什么,它都根本不起作用。我什至无法在 SSIS 任务 Excel 源中预览文件。
当我尝试为
ConnectionString
创建表达式时,当我添加 IMEX=1
时,我确实取得了一些成功。我可以在 SSIS 任务 Excel 源中预览该文件。我尝试在扩展属性中添加 ReadOnly=0
,但没有成功。
但是包在本地或 SERV_SSIS_CATALOG 上不断失败,并出现以下错误:
Load Excel Base File:Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E09.
An OLE DB record is available. Source: "Microsoft Access Database Engine" Hresult: 0x80040E09 Description: "Cannot update. Database or object is read-only.".
我检查了 SERV_FILE 上 Excel 文件的权限,我确实拥有
Full Control
上的所有内容。
我不知道接下来要尝试什么,或者是否有其他方法可以将 SQL 请求摄取到 Excel 文件。
编辑:我注意到一些奇怪的事情是,如果我确实使用表达式,则 ConnectionString 在 SERV_SSIS_CATALOG 上的包 ConnectionManagers 参数中不可见(否则它是完全可见的)。但我不知道该怎么想,因为该包似乎尝试访问该文件,但由于只读属性而被拒绝。
我终于找到了解决办法。
在 Excel 连接管理器中,如果 ConnectionString 表达式已参数化,则 ExcelFilePath 也需要参数化。
示例:
连接字符串:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @[$Project::excel_file_path] + ";Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";"
Excel文件路径:
@[$Project::excel_file_path]
请注意连接字符串表达式中使用反斜杠,这是双引号所必需的。
如果您有许多 Excel 连接管理器,也可以对连接字符串的第一部分和最后部分进行参数化。