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)
我愿意知道:
我认为该问题与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)
您可以在以下链接中找到其他方法:
在搜索时,我发现以下链接提供了一种循环报告和进行更改的方法。您只需要替换To_Date(:Date_Parameter)
为To_Date(:Date_Parameter,’MM/DD/YYYY’)
:
通过编辑ReportViewer.aspx强制文化信息
您可以编辑ReportViewer.aspx
位于SQL Server报告服务目录中的文件,并强制在报告中使用区域性信息。请查看以下问题,它将为您提供更多详细信息:
更改浏览器语言设置
检查以下链接(阅读Mike Honey和Nick St Mags的答案):
除了@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的提供程序的原因。
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客户端软件组件。”
归档时间: |
|
查看次数: |
803 次 |
最近记录: |