【问题标题】:Oracle Date format exception in SQL Server Reporting ServicesSQL Server Reporting Services 中的 Oracle 日期格式异常
【发布时间】:2019-08-04 05:51:40
【问题描述】:

之前我的客户使用 SSRS 2008R2 和 Oracle 作为事务数据库。最近他们已升级到 SSRS 2017,现在许多报告都抛出以下错误:

错误:投掷 Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: [异常终止:报告处理], Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: 报告处理过程中发生错误。 ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: 数据集“Ds_Main”的查询执行失败。 ---> Oracle.ManagedDataAccess.Client.OracleException: ORA-01830: 日期 格式图片在转换整个输入字符串之前结束

在仔细查看报告查询后,我注意到此错误适用于所有使用 oracle 函数 TO_DATE(<Date Value>) 且未使用日期格式的报告。例如:

To_date(:Date_Parameter) -> this syntax throws above mentioned error
To_Date(:Date_Parameter,’MM/DD/YYYY’) -> this syntax works perfectly

我愿意知道:

  1. SSRS 2017 与 SSRS 2008 R2 发生了哪些变化导致此问题,因为相同的报告在 SSRS 2008 R2 中按预期工作,并且在 SSRS 2017 中抛出了上述错误。
  2. 是否有任何建议可以在不更新大量报告的情况下解决此问题?

【问题讨论】:

  • 报告是否都调用了一个存储过程,您可以在其中更新日期的格式,然后再传递给报告?或者您是否在每个报告中设置了查询?据我所知,您可能有一些不符合默认日期格式的数据。理想情况下,您不会依赖如此广泛的隐式转换。
  • 所有报告仅在报告中使用嵌入式 Oracle plsql 查询
  • @Aftab 在您提到的Any suggestion to fix this issue without updating bunch of reports 的问题中,在阅读了您的 cmets 在下面的答案之后,看起来问题已更改为 I am willing to know what has changed in SSRS2017 vs SSRS2008R2 that is causing this issue because same reports are working as expected in SSRS2008R2。请更新您的问题以更具体地了解您要查找的内容。因为我认为没有比答案中提到的更多的解决方法。
  • @Aftab 我认为 yahfoufi 的意思是您应该添加新问题而不是删除旧问题。由于您在收到答案后无法更改问题。我修好了
  • @Aftab 我虽然很难决定接受哪个答案。由于您得到了 2 个有用的答案,并且每个答案都针对您的问题的一部分。最后,一位用户将获得赏金。祝你好运

标签: sql-server oracle reporting-services ssrs-2008-r2 ssrs-2017


【解决方案1】:

试图找出问题

我认为该问题与 Visual Studio 升级无关。它与作为参数传递给TO_DATE()函数的日期格式有关。

基于Oracle / PLSQL: ORA-01830 Error Message的官方文档:

原因:您尝试输入日期值,但输入的日期与日期格式不匹配。

在 Oracle 中,默认日期格式一般为 DD-MON-YYYY。如果您尝试输入不符合此格式的日期值。

您似乎以dd-MMM-yyyy 格式传递了日期参数,现在它们以MM/dd/yyyy 的形式传递。

首先,检查区域设置或应用程序文化信息没有改变。


可能的解决方法

您可以使用多种方法解决此问题:

(1)处理参数日期格式

如果你不想编辑所有代码,那么强制参数数据字符串格式更容易,确保传递给TO_DATE()函数的所有参数都是以下格式(或尝试更改默认值操作系统区域设置中的日期格式)

dd-MMM-yyyy   example: 01-AUG-2019

(2) TO_DATE函数添加日期格式

如果您确定日期参数格式是固定的并且不会更改,那么您可以按照问题中提到的那样编辑您的代码:

To_Date(:Date_Parameter,’MM/DD/YYYY’)

(3) 将日期和格式作为参数传递

这也需要更改代码,但您会将日期和格式作为参数传递。

To_Date(:Date_Parameter,:DateFormat_Parameter)

您可以在以下链接中找到其他方法:


更新 1 - 在多个报告中进行共同更改

在搜索时,我发现以下链接提供了一种循环报告并进行更改的方法。您只需将To_Date(:Date_Parameter) 替换为To_Date(:Date_Parameter,’MM/DD/YYYY’)


更新 2 - 其他可能的解决方法

通过编辑 ReportViewer.aspx 强制获取文化信息

您可以编辑位于 SQL Server 报告服务目录中的 ReportViewer.aspx 文件,并强制在报告中使用文化信息。查看以下问题,它将为您提供更多详细信息:

更改浏览器语言设置

检查以下链接(阅读 Mike Honey 和 Nick St Mags 的答案)


更新 3 - 问题原因

除了 @DavidBrownie 发布的内容之外,我还发现了 SQL Server 2008 R2 文档:

他们提到的地方:

这种内置数据源类型基于 .NET Framework Managed Provider for Oracle,需要 Oracle 客户端软件组件。

另外,如果您查看 SQL Server 2017 文档:

这种内置数据源类型直接使用 Oracle Data Provider,需要 Oracle 客户端软件组件。

另外,参考Microsoft OLE DB Provider for Oracle documentation(这是老用的provider)。他们提到:

此功能将在 Windows 的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。而是使用 Oracle 的 OLE DB 提供程序。

这就是在 Reporting Services 中更改用于连接到 Oracle 的提供程序的原因。

【讨论】:

  • @Aftab 尝试按照第一种方法更改操作系统区域设置
  • @Aftab 参数如何传递给报表??
  • 感谢哈迪的建议。我了解通过添加所需的日期格式将解决此问题。我愿意知道导致此问题的 SSRS2017 与 SSRS2008R2 发生了什么变化,因为相同的报告在 SSRS2008R2 中按预期工作。由于有 500 多个报告有类似的问题,我愿意找到一种方法可以帮助我在不修改报告代码的情况下继续前进。
  • 嗨@Hadi - 感谢您提供链接,但我愿意了解导致此问题的 SSRS2017 与 SSRS2018 的架构/行为变化,而不是进行报告修改。
  • @Aftab 随时欢迎您。我完全尊重你的选择。请注意:请不要在得到答案后更改主要问题。您开始询问解决方法,然后您更改了主要问题以询问原因。无论如何,希望我能帮助解决这个问题。祝你好运
【解决方案2】:

SSRS2017 与 SSRS2008R2 的变化

SSRS 2008 使用了 System.Data.OracleClient。在 SSRS 2016 及更高版本中,您必须安装由 Oracle 构建和支持的 Oracle ODP.NET 提供程序。所以可能只是两个驱动程序设置 NLS_DATE_FORMAT 会话参数的方式不同。

如果您使用此查询将数据集添加到报表中,则可以查看您的设置:

select parameter, value 
from nls_session_parameters 
where parameter like 'NLS%'
order by parameter

不幸的是,似乎没有办法在 Oracle.ManagedDataAccess 中全局更改客户端日期格式,因此您必须在报表数据集查询中进行所有更改。

或者,您可以尝试确保您传递的是日期参数而不是字符串参数。如果将日期传递给 Oracle 的 to_date() 函数,则无需指定格式。

SSRS 2014 的文档 “这种内置数据源类型基于 .NET Framework Managed Provider for Oracle,需要 Oracle 客户端软件组件。”

对于SSRS 2016,“这种内置数据源类型直接使用Oracle Data Provider,需要Oracle 客户端软件组件。”

【讨论】:

  • 感谢 David 在这里强调了架构变化。 SSRS2017 MSDN 中是否提到了这个变化?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多