10

Earlier my client was using SSRS 2008R2 with Oracle as transaction database. Recently they have upgraded to SSRS 2017 and now many reports are throwing following error:

ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: [AbnormalTermination:ReportProcessing], Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: An error has occurred during report processing. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Query execution failed for dataset 'Ds_Main'. ---> Oracle.ManagedDataAccess.Client.OracleException: ORA-01830: date format picture ends before converting entire input string

After closely looking into report query, I have noticed that this error is for all those reports where oracle function TO_DATE(<Date Value>) has been used without date format. For example:

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

I am willing to know:

  1. what has changed in SSRS 2017 vs SSRS 2008 R2 that is causing this issue because same reports are working as expected in SSRS 2008 R2 and it is throwing above error in SSRS 2017.
  2. Is there is any suggestions to fix this issue without updating bunch of reports?
4

2 回答 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 数据提供程序,并且需要 Oracle 客户端软件组件。”

于 2019-03-17T16:54:51.647 回答
7

试图找出问题所在

我认为这个问题与 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

(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 强制文化信息

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

更改浏览器语言设置

检查以下链接(阅读 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 文档 (这是旧使用的提供程序)。他们提到:

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

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

于 2019-03-17T14:46:40.763 回答