Исключение формата даты Oracle в службах отчетов SQL Server - PullRequest
10 голосов
/ 13 марта 2019

Ранее мой клиент использовал SSRS 2008R2 с Oracle в качестве базы данных транзакций.Недавно они обновились до SSRS 2017, и теперь во многих отчетах выдается следующее сообщение об ошибке:

ОШИБКА: выбрасывание Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: [AbnormalTermination: ReportProcessing], Microsoft.ReportingServices.ReportProcessing.ProcessingAortedПроизошла ошибка во время обработки отчета.---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: сбой выполнения запроса для набора данных 'Ds_Main'.---> Oracle.ManagedDataAccess.Client.OracleException: ORA-01830: изображение в формате даты заканчивается перед преобразованием всей входной строки

После тщательного изучения запроса отчета я заметил, что эта ошибка для всехте отчеты, где функция оракула 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. Есть ли какие-либо предложения по устранению этой проблемы без обновления группы отчетов?

Ответы [ 2 ]

9 голосов
/ 17 марта 2019

Попытка выяснить проблему

Я не думаю, что проблема связана с обновлением Visual Studio.Он связан с форматом даты, передаваемым в качестве параметра функции TO_DATE().

На основании официальной документации Oracle / PLSQL: ORA-01830 Сообщение об ошибке :

Причина: Вы пытались ввести значение даты, но введенная дата не соответствовала формату даты.

В 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) Passдата и формат в качестве параметров

Это также требует изменения кода, но вы передадите дату и формат в качестве параметров.

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.и форсировать информацию о культуре, используемую в отчетах.Проверьте следующий вопрос, он даст вам более подробную информацию:

Изменениеязыковые настройки браузера

Проверьте следующую ссылку (прочитайте ответы Майка Хани и Ника St Mags) :


Обновление 3 - причина проблемы

В дополнение к тому, что @ DavidBrownie опубликовано, я нашелдокументация по SQL Server 2008 R2:

Где они упоминались:

Этот встроенный тип источника данных основан на .NET Framework Managed Provider for Oracle и требует компонента программного обеспечения клиента Oracle.

Также, если вы посмотрите документацию по SQL Server 2017:

Этот тип встроенного источника данных напрямую использует поставщик данных Oracle и требует компонента программного обеспечения клиента Oracle.

Кроме того, ссылка на Поставщик Microsoft OLE DB для Oracleдокументация (которая является старым использованным провайдером) .Они упомянули, что:

Эта функция будет удалена в следующей версии Windows.Избегайте использования этой функции в новых разработках и планируйте модифицировать приложения, которые в настоящее время используют эту функцию.Вместо этого используйте поставщика OLE DB для Oracle.

Именно поэтому сменился поставщик, используемый для подключения к Oracle в службах Reporting Services.

8 голосов
/ 17 марта 2019

что изменилось в SSRS2017 по сравнению с SSRS2008R2

SSRS 2008 использовал старый System.Data.OracleClient. В SSRS 2016 и более поздних версиях необходимо установить поставщик Oracle ODP.NET, созданный и поддерживаемый Oracle. Так что, вероятно, разница в том, как параметр сеанса NLS_DATE_FORMAT устанавливается двумя драйверами.

Вы можете увидеть настройки, если добавите набор данных в свой отчет с помощью этого запроса:

select parameter, value 
from nls_session_parameters 
where parameter like 'NLS%'
order by parameter

К сожалению, по-видимому, нет способа глобально изменить формат даты клиента в Oracle.ManagedDataAccess, поэтому вам придется вносить все изменения в запросы к набору данных отчета.

В качестве альтернативы вы можете убедиться, что вы передаете параметры Date, а не строковые параметры. Если вы передаете дату в функцию Oracle to_date (), вам не нужно указывать формат.

Документы для SSRS 2014 «Этот встроенный тип источника данных основан на .NET Framework Managed Provider for Oracle и требует клиентского программного компонента Oracle».

И для SSRS 2016"Этот тип встроенного источника данных напрямую использует поставщик данных Oracle и требует клиентского программного компонента Oracle."

...