使用表达式的 SSIS Excel 连接管理器失败:“无法更新。数据库或对象是只读的”

问题描述 投票:0回答:1

我在这个错误上挣扎了很长时间。

这是我的项目的配置:

  • 部署 SSIS 包的服务器 SERV_SSIS_CATALOG
  • 服务器 SERV_FILE(另一个),其中包含先前服务器(以及我的用户)可以访问的文件
  • 带有 Excel 连接管理器的 SSIS 包。

目标:使用项目参数创建动态 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 dynamic ssis ssis-connection-manager
1个回答
0
投票

我终于找到了解决办法。

在 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 连接管理器,也可以对连接字符串的第一部分和最后部分进行参数化。

© www.soinside.com 2019 - 2024. All rights reserved.