none
oo4oからODP.NETに変更したことに伴うエラー RRS feed

  • 質問

  • VB6で開発のプログラムではoo4oを使用してDBアクセスしていましたが、VS2015へマイグレーションをするのに伴い、ODP.NETを使用するように変更しました。

    その結果、VB6(oo4o)では問題ないsqlが、ODP.NETだとエラーになる場合があることがわかりました。

    今わかっているのは、to_date関数を使用した際に、以下のエラーが発生します。

    例:select TO_DATE('20170904'),'D') from dual

    「ORA-01861:literal does not match fomat string」

    SQL Plusで実行した場合、oo4oを使用してDBアクセスした場合ではエラーになりませんが、ODP.NETを使用したDBアクセスではエラーになります。

    なお、ODP.NETをインストールした際、HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_{ODP.NETの名称}のNLS_LANGがデフォルトで「AMERICAN_AMERICA.WE8MSWIN1252」となっておりましたが、この設定だと上記エラーが発生します。

    一方で、NLS_LANGを「JAPANESE_JAPAN.JA16SJISTILDE」に変更すると上記エラーは発生しなくなりました。

    ①言語設定によることが原因である可能性というところまではわかりました。実際、原因はODP.NETインストール時の言語設定によるものなのでしょうか。

    ②上記レジストリの変更を行わなくても、代わりにエラーを解消する方法があればご教授いただきたいです。ただし、修正の手間は削減したいため、原則ソース内のSQLは修正しない想定です。一括置換等で対応できるのであればSQL修正も選択肢の一つとして考えたいです。

    ③TO_DATE関数でのエラーは検出できましたが、oo4oからODP.NETに変更したことに伴って他に注意すべきことがあればご教授いただきたいです。


    • 編集済み maclourin 2017年9月4日 10:47
    2017年9月4日 10:40

すべての返信

  • こんにちは。

    TO_DATEのデフォルトフォーマットは、NLS_DATE_FORMATを使用しますのでグローバリゼーションに依存するようです。
    今回のケースだとoo4oとODP.NET で別の設定になっているのだと思います。

    OracleGlobalizationクラスを使用することでセッションおよびスレッド内のグローバリゼーションを変更可能なようなので、NLS_DATE_FORMATまたはNLS_LANGを変更してみてください。
    SQLは修正せずにコネクション前後などの共通処理の修正で済むのではないでしょうか。

    2017年9月20日 6:49
    モデレータ
  • maclourin さん、こんにちは
    フォーラム オペレーターの立花楓です。

    本件について、しばらくお時間が経ちましたが問題は解決しましたでしょうか。
    Tak1wa さんさんから問題解決の参考となると思われる情報をお寄せいただいておりますので、何か進展がございましたらこちらのスレッドへご返信いただけますと幸いです。

    また、今後参考になる情報がありましたら、投稿者からの [回答としてマーク] をお願いします。
     
    宜しくお願いします。


    MSDN/TechNet Community Support 立花楓

    2017年9月27日 2:13
    モデレータ