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

Sql server SQL Server Reporting Services中的Oracle日期格式异常,sql-server,oracle,reporting-services,ssrs-2008-r2,ssrs-2017,Sql Server,Oracle,Reporting Services,Ssrs 2008 R2,Ssrs 2017,早些时候,我的客户使用SSRS2008R2和Oracle作为事务数据库。最近,他们已升级到SSRS 2017,现在许多报告抛出以下错误: 错误:投掷 Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: [异常终止:报告处理], Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: 报表处理过程中发生错误。-->

早些时候,我的客户使用SSRS2008R2和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()
但没有使用日期格式的报表。例如:

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

  • 与SSRS 2008 R2相比,SSRS 2017中发生了哪些变化,导致了此问题,因为SSRS 2008 R2中的报告与预期相同,并且在SSRS 2017中出现了上述错误
  • 是否有任何建议可以在不更新大量报告的情况下解决此问题
  • 试图找出问题所在 我认为这个问题与VisualStudio升级无关。它与作为参数传递给
    to_date()
    函数的日期格式有关

    根据官方文件:

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

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

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

    首先,检查区域设置或应用程序区域性信息是否没有更改


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

    (1)处理参数日期格式

    如果不想编辑所有代码,则更容易强制参数数据字符串格式,请确保传递到
    to_DATE()
    函数的所有参数均采用以下格式(或尝试从操作系统区域设置更改默认日期格式)

    dd-MMM-yyyy   example: 01-AUG-2019
    
    (2)将日期格式添加到日期函数中

    如果您确定日期参数格式是固定的且不会更改,则可以按照问题中所述编辑代码:

    To_Date(:Date_Parameter,’MM/DD/YYYY’)
    
    (3)将日期和格式作为参数传递

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

    To_Date(:Date_Parameter,:DateFormat_Parameter)
    
    您可以在以下链接中找到其他方法:


    更新1-在多个报告中进行通用更改 在搜索时,我发现以下链接提供了一种方法来循环报告并进行更改。您只需将
    to_Date(:Date_参数)
    替换为
    to_Date(:Date_参数,'MM/DD/YYYY')


    更新2-其他可能的解决办法 通过编辑ReportViewer.aspx强制提供区域性信息

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

    更改浏览器语言设置

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


    更新3-问题原因 除了发布的内容之外,我还发现了SQL Server 2008 R2文档:

    他们提到:

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

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

    此内置数据源类型直接使用Oracle数据提供程序,并且需要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
    
    不幸的是,在Oracle.ManagedDataAccess中似乎没有全局更改客户端日期格式的方法,因此您必须在报表数据集查询中进行所有更改

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

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


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

    报告是否都调用存储过程,您可以在传递到报告之前更新日期格式?或d