web-dev-qa-db-ja.com

SQL Server ReportingServicesでのOracle日付形式の例外

以前、私のクライアントは、トランザクションデータベースとしてOracleを使用したSSRS2008R2を使用していました。最近、SSRS 2017にアップグレードされ、現在、多くのレポートが次のエラーをスローしています。

エラー:Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedExceptionをスローします:[AbnormalTermination:ReportProcessing]、Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException:レポート処理中にエラーが発生しました。 ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException:データセット 'Ds_Main'のクエリの実行に失敗しました。 ---> Oracle.ManagedDataAccess.Client.OracleException:ORA-01830:入力文字列全体を変換する前に日付形式の画像が終了します

レポートクエリを詳しく調べたところ、このエラーは、Oracle関数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. 同じレポートがSSRS2008 R2で期待どおりに機能し、SSRS 2017で上記のエラーをスローしているため、この問題の原因となっているSSRS2017とSSRS2008R2の変更点。
  2. 一連のレポートを更新せずにこの問題を修正するための提案はありますか?
10
Aftab Ansari

sSRS2017とSSRS2008R2の変更点

SSRS 2008は、oldSystem.Data.OracleClientを使用しました。 SSRS 2016以降では、Oracleによって構築およびサポートされているOracleODP.NETプロバイダーをインストールする必要があります。したがって、おそらくNLS_DATE_FORMATセッションパラメータが2つのドライバによって設定される方法の違いにすぎません。

このクエリを使用してレポートにデータセットを追加すると、設定を確認できます。

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 Data Providerを直接使用し、Oracleクライアントソフトウェアコンポーネントを必要とします。"

問題を理解しようとしています

この問題はVisualStudioのアップグレードに関連しているとは思いません。これは、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を編集してカルチャ情報を強制する

SQL Serverレポートサービスディレクトリにある_ReportViewer.aspx_ファイルを編集して、レポート内で使用されるカルチャ情報を強制することができます。次の質問をチェックしてください。詳細がわかります。

ブラウザの言語設定を変更する

次のリンクを確認してください(MikeHoneyとNickSt Magsの回答を読んでください)


アップデート3-問題の原因

@ DavidBrownieが投稿した内容に加えて、SQL Server 2008R2のドキュメントを見つけました。

彼らが言及した場所:

この組み込みデータソースタイプは、.NET Framework Managed Provider for Oracleに基づいており、Oracleクライアントソフトウェアコンポーネントが必要です。

また、SQL Server 2017のドキュメントを見ると、次のようになります。

この組み込みデータソースタイプは、Oracle Data Providerを直接使用し、Oracleクライアントソフトウェアコンポーネントを必要とします。

さらに、 Microsoft OLE DB Provider for Oracleドキュメント(これは古い使用済みプロバイダーです)を参照してください。言及:

この機能は、Windowsの将来のバージョンで削除される予定です。新しい開発作業でこの機能を使用することは避け、現在この機能を使用しているアプリケーションを変更することを計画してください。代わりに、OracleのOLE DBプロバイダーを使用してください。

これが、ReportingServicesでOracleへの接続に使用されるプロバイダーを変更する理由です。

9
Hadi