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

Aft*_*ari 10 sql-server oracle reporting-services ssrs-2008-r2 ssrs-2017

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

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

在仔细研究了报表查询之后,我注意到此错误是针对所有TO_DATE(<Date Value>)使用了不带日期格式的oracle函数的报表的。例如:

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

我愿意知道:

  1. SSRS 2017与SSRS 2008 R2发生了什么变化,导致此问题,因为相同的报告正在SSRS 2008 R2中按预期工作,并且抛出了SSRS 2017中的错误。
  2. 是否有任何建议可解决此问题而不更新报告?

Had*_*adi 9

试图找出问题

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

基于Oracle / PLSQL的官方文档:ORA-01830错误消息

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

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

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

首先,检查区域设置或应用程序文化信息是否未更改。


可能的解决方法

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

(1)处理参数日期格式

如果您不想编辑所有代码,则更容易强制使用参数数据字符串格式,请确保传递给TO_DATE()函数的所有参数都采用以下格式(或尝试从OS区域设置更改默认日期格式)

dd-MMM-yyyy   example: 01-AUG-2019
Run Code Online (Sandbox Code Playgroud)

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

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

To_Date(:Date_Parameter,’MM/DD/YYYY’)
Run Code Online (Sandbox Code Playgroud)

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

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

To_Date(:Date_Parameter,:DateFormat_Parameter)
Run Code Online (Sandbox Code Playgroud)

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


更新1-在多个报告中进行通用更改

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


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

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

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

更改浏览器语言设置

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


更新3-问题原因

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

他们提到的地方:

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

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

此内置数据源类型直接使用Oracle数据提供程序,并且需要Oracle客户端软件组件。

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

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

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


Dav*_*oft 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

对于SSRS 2016, “此内置数据源类型直接使用Oracle数据提供程序,并且需要Oracle客户端软件组件。”