SQL Server Reporting Services 中的 Oracle 日期格式异常

10

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

错误:抛出 Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: [AbnormalTermination:ReportProcessing], 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. 是否有任何建议可以解决此问题,而无需更新大量报告?

报告是否都调用存储过程,以便在传递给报告之前更新日期格式?还是每个报告中都设置了查询?从我所看到的情况来看,您可能有一些数据不符合默认日期格式。理想情况下,在如此广泛的级别上不应该依赖隐式转换。 - Steve-o169
所有报告都仅使用嵌入式Oracle plsql查询。 - Aftab Ansari
1
@Aftab在问题中提到“有没有建议可以在不更新大量报告的情况下解决此问题”,在阅读下面答案的评论后,看起来问题已经改为“我想知道SSRS2017与SSRS2008R2之间发生了什么变化,导致同样的报告在SSRS2008R2中按预期工作”。请更新您的问题,以便更具体地说明您要寻找什么。因为我认为除了答案中提到的方法外,没有更多的解决方法了。 - Yahfoufi
@Aftab,我认为yahfoufi的意思是你应该添加新问题而不是删除旧问题。因为在收到答案后无法更改问题。我已经修复了它。 - Hadi
@Aftab 我觉得很难决定接受哪个答案。因为你得到了两个有帮助的答案,每个答案都针对你问题的一部分。最终只有一个用户会获得赏金。祝好运! - Yahfoufi
@Yahfoufi 24,我没有看到授予悬赏的选项? - Aftab Ansari
2个回答

8

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中提到了吗? - Aftab Ansari

7

尝试查明问题

我认为问题与 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强制Culture信息

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

更改浏览器语言设置

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


更新3-问题原因

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

他们提到:

此内置数据源类型基于.NET Framework托管的Oracle提供程序,并需要Oracle客户端软件组件。

如果您查看SQL Server 2017文档:

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

此外,参考Microsoft OLE DB Provider for Oracle文档(这是旧的提供程序)。他们提到:

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

这就是更改连接到Oracle的提供程序的原因。


@Aftab 尝试按照第一种方法中提到的更改操作系统区域设置。 - Hadi
谢谢Hadi的建议。 我明白通过添加所需的日期格式将解决此问题。我想知道在SSRS2017与SSRS2008R2之间发生了什么变化,导致出现此问题,因为相同的报告在SSRS2008R2中按预期工作。由于有500多个报告存在类似的问题,我希望找到一种方法,可以帮助我在不修改报告代码的情况下继续前进。 - Aftab Ansari
1
嗨@Hadi - 感谢提供链接,但我想了解SSRS2017与SSRS2018之间的架构/行为变化是导致此问题的原因,而不是进行报告修改。 - Aftab Ansari
@Aftab 我找到了 SSRS 2008R2 的官方文档,请查看答案更新。现在,如果你将我的答案与 David Brownie 的答案结合起来,你就拥有了所有需要的信息。 - Hadi
1
@Aftab,欢迎随时来咨询。我非常尊重你的选择。友情提示:请勿在回答后更改主要问题。你一开始询问的是解决方案,然后又改成了询问原因。无论如何,希望我能帮助解决问题。祝好运! - Hadi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接