以前、私のクライアントは、トランザクションデータベースとして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
私は知りたいです:
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)
_
次のリンクで他の方法を見つけることができます:
検索中に、レポートをループして変更を加える方法を提供する次のリンクを見つけました。 To_Date(:Date_Parameter)
をTo_Date(:Date_Parameter,’MM/DD/YYYY’)
に置き換えるだけです。
ReportViewer.aspxを編集してカルチャ情報を強制する
SQL Serverレポートサービスディレクトリにある_ReportViewer.aspx
_ファイルを編集して、レポート内で使用されるカルチャ情報を強制することができます。次の質問をチェックしてください。詳細がわかります。
ブラウザの言語設定を変更する
次のリンクを確認してください(MikeHoneyとNickSt Magsの回答を読んでください):
@ 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への接続に使用されるプロバイダーを変更する理由です。