C#,VS2010で、Oracleに接続するプログラムを書いています。その中で.net標準ライブラリ("System.Data.OracleClient")で接続後に、ODPで接続するとなぜか、TypeInitializationExceptionが発生してしまいます。何か処理が抜けているのでしょうか。ちなみに、ODPのあとに、.net標準ライブラリで実行してもエラーにはなりません。以下、再現ソースです。タイプ初期化子が例外をスローしました。タイプ初期化子が例外をスローしました。Oracleクライアントのバージョンと互換性のないプロバイダです。C#,VS2010で、Oracleに接続するプログラムを書いています。TypeInitializationExceptionが発生してしまいます。タイプ初期化子が例外をスローしました。ODPのバージョンは、2.102.2.20まず、何が原因なのか切り分けていくのがいいと思います。ODPの参照設定は正しくできていますか?DbProviderFactoriesを使わないでODPを使用した場合、接続できますか?システム内にバージョンの異なるODPがインストールされていませんか?あと提示して頂いたソースだけでは判断できないのですが、connの変数名が同じなのが気になるかも。disposing)どうもconnをDisposeしに行ってるっぽいんで、もし提示しているコードをそのまま流しているのであれば.NET標準ライブラリを使用しているコードをコメントするか、conn2のような名前に変更して例外が発生するかどうかも確認してみてください。返信>>C#,VS2010で、Oracleに接続するプログラムを書いています。>>その中で.net標準ライブラリ("System.Data.OracleClient")で接続後に、ODPで接続すると>>なぜか、TypeInitializationExceptionが発生してしまいます。タイプ初期化子が例外をスローしまし>>た。タイプ初期化子が例外をスローしました。Oracleクライアントのバージョンと互換性のないプ>>ロバイダです。何が原因なのか切り分けていくのがいいと思います。あと提示して頂いたソースだけでは判断できないのですが、connの変数名が同じなのが気になるかも。connをDisposeしに行ってるっぽいんで、もし提示しているコードをそのまま流しているのであれば.NET標準ライブラリを使用しているコードをコメントするか、conn2のような名前に変更して例外が発生するかどうかも確認してみてください。09:13:14)(*)間違い送信してしまいました。つきあっていただいてありがとうございます。ある程度、切り分けはできている状態ではあるのですが。>まず、何が原因なのか切り分けていくのがいいと思います。>ODPの参照設定は正しくできていますか?提示のコードでは、DbProviderFactoryによる抽象クラスによるコーディングなのでODP、.net標準ライブラリの参照設定は行っていません。>DbProviderFactoriesを使わないでODPを使用した場合、接続できますか?できます。エラー!という状況です。>システム内にバージョンの異なるODPがインストールされていませんか?GACのOracle.DataAccessを確認したところ↓がインストールされています。10.1.0.20010.1.0.4002.102.2.20>あと提示して頂いたソースだけでは判断できないのですが、connの変数名が同じなのが気になるかも。disposing)>どうもconnをDisposeしに行ってるっぽいんで、もし提示しているコードをそのまま流しているのであれば.NET標準ライブラ>リを使用しているコードをコメントするか、conn2のような名前に変更して例外が発生するかどうかも確認してみてくださ>い。conn2も試したところ同様の結果でした。実際のコードは同じソースで、パラメータのみ切り替えて使用しています。提示のコードは、それを再現する最小限のソースコードを書いたというものです。最小限のソースコードで再現するので、提示コードの中(あるいは環境?)に問題があるのは間違いなさそうです。一応、DbProviderFactoriesを使わない、変数を使いまわししないソースコード(↓参照)で記述してみましたが、同様のエラーが発生します。(*)間違い送信してしまいました。つきあっていただいてありがとうございます。ある程度、切り分けはできている状態ではあるのですが。掘り下げて調べていくしかないですね。ODP、.net標準ライブラリの参照設定は行っていません。GACのOracle.DataAccessを確認したところ↓がインストールされています。21:50:32)>>>システム内にバージョンの異なるODPがインストールされていませんか?>>GACのOracle.DataAccessを確認したところ↓がインストールされています。同様な現象が発生します。参照の追加で、Oracle.DataAccessは、2.102.2.20しか選択肢として現れないです。環境はないのですが、興味があるので確認させてください。Oracle.DataAccess.Client.OracleConnection()){}もしこれでエラーが発生するんでしたら、オラクルに問い合わせたほうがいいかもしれないと思いました。普通は2つのプロバイダを使う必要性はないと思うので、どうしてそうされているのかも興味があります。10:51:30)お付き合いくださり、ありがとうございます。}上記ケースは、さすがに発生しませんでした。それとも再現条件にはOpenやTransactionも必要なんでしょうか?このusingの間に↓をいれると同じエラーが発生します。ID=ユーザーID;Password=パス";conn.Open();conn.Close();Openが再現条件です。(エラーは同様と書かれましたが、TypeInitializationExceptionですか?)はい。TypeInitializationExceptionです。普通は2つのプロバイダを使う必要性はないと思うので、どうしてそうされているのかも興味があります。Windowsツールを作っていまして、すきなプロバイダーを設定画面で設定してDBアクセスするツールになります。1度の実行(exeを実行して終了するまで)の中で、複数プロバイダーを使用するケースが生まれています。して、プロバイダが異なるEXEを続けて実行した場合にもエラーが発生したりするんでしょうか?この場合は、発生しません。.net標準ライブラリでopenした後の、後片付けがきちんどできていないためのエラーのように見えます。だめもとですが、2つめのusingの前でGC.Collect()を実行しても変わらないでしょうか?試したところ、変わりませんでした。Open不要な場合は関係ないですが、1つめの接続でPoolingを無効にしても同じでしょうか?以下のようにしましたが、やはり同じエラーが発生しました。TypeInitializationException"でググったりgooglingすると、.configでのバージョンのリダイレクト指定で回避できてるようです。newVersion="10.1.0.400"/></dependentAssembly></assemblyBinding></runtime>想像ですが、もしこれで直るとすると、System.Data.OracleClientがロードしたバージョンとは別のバージョンをODPが使おうとしてロードに失敗してるのかなと思いました。newVersion="10.1.0.400"/>↑を試したところ、少し状況が変わりました。Oracle.DataAccess.Client.OracleConnection()↑で落ちていたのが、コネクションオープン後の、BeginTransaction()で落ちるようになりました。newされたコネクションを見てみると、stateがClosedで、Openしているのに開けていないようです。1歩前進したような気がします。開けていないようです。コネクションオープン後の、BeginTransaction()で落ちるようになりました。OpenしてもstateがClosedのままということですか?そうです。OpenしてもClosedのままです。>>コネクションオープン後の、BeginTransaction()で落ちるようになりました。今は以下のコードのような状況ですね?はい。再現コードをそのまま乗せるとこんな感じです。bindingRedirectするとここでエラー。「10.1.0.400」のところを「10.1.0.200」にしても同じでしょうか?結果はかわらず、BeginTransactionで以下のエラーでした。インスタンスに設定されていません。"}指定は以下のように行っています。OpenしてもClosedのままです。一昨日から急に出張が決まって、レスできなくて申し訳ありません。なしさんフォローありがとうございます。この2日の間にかなりの進展があって良かったです。OpenしているのにStateがClosedってことは、正常にOpenできてないみたいですね。一昨日から急に出張が決まって、レスできなくて申し訳ありません。なしさんフォローありがとうございます。この2日の間にかなりの進展があって良かったです。すいません、私こそ、みなさんフォローありがとうございます。OpenしているのにStateがClosedってことは、正常にOpenできてないみたいですね。不具合の発生する環境には、複数のOracleClientが同居してたと思うのですが、tnsの設定は両方ともされていますか?↓がインストールされています、それぞれ以下フォルダ配下です。d:\oracle\product\10.2.0\Db_1で、それぞれ、まったく同じtnsが設定されています。>>コネクションオープン後の、BeginTransaction()で落ちるようになりました。すいません、↑で落ちる件は、.net標準ライブラリでつながないで、ODP単体で実行しても発生しました。フリダシに戻ってしまったようです。ためしに、10.1.0.200、10.1.0.400のOracle.DataAccess.dllをGACからアンインストールしてみました。これでアセンブリを間違って使うこともないかと思いましたが結果は、↓の最初と同じエラーで変わらずでした。タイプ初期化子が例外をスローしましたODP単体で動作することから、.net標準ライブラリの後始末ができていないように見えます。ちなみにこれは、みなさんの環境でも発生するのでしょうか。環境を作って試そうとしたんですが、結局、中途半端な検証になっちゃいました。バージョンも違うし、2バージョン入れることもできませんでした。「10.2.0.100」と「2.102.2.20」の混在では、エラーは発生しないようです。10.2.0.100」が追加されました。参照設定の「参照」のタブで、「bin」のフォルダの「Oracle.DataAccess.dll」を指定して再現コードを実行しても、エラーなく正常実行できました。インストールGACには上記に加え、「1.102.2.20」と「2.102.2.20」が追加されました。参照設定の「参照」のタブで、「ODP.NET\bin\2.x」のフォルダの「Oracle.DataAccess.dll」を指定して再現コードを実行しても、エラーなく正常実行できました。(参照設定の「.NET」のタブには「Oracle.DataAccess」は表示されませんでした。「Oracle.DataAccess」は「1.102.3.0」しかインストールされませんでした。最初にインストールされてた「10.2.0.100」がGACから消えました。この状態で「2.102.2.20」の「Oracle.DataAccess」を使った実行は、エラーなく正常実行できました。DbProviderFactoriesで作成する場合のバージョンは、machine.configに設定されてるようです。http://codezine.jp/article/detail/1200はつねさんので解決しますように。さん、ありがとうございます。/>〜は試したのですが、やはり同様のエラーでした。なしさん、検証までしていただいてありがとうございます。申しわけなくなってきました。こちらでも、私以外の環境で試してみたのですがOracle11gインストールのみをインストールした↓の環境では、エラーが発生しませんでした。1.111.6.02.111.6.0これから、10g系のODPのバグ?かと思っていましたがなしさんの環境だと、ほぼ私と同じ環境で、エラー再現しないのですね。わからなくなってきました。ところで、追加で情報なのですが、connectionのnewの例外の後にもう1つ例外が発生します。タイプ初期化子が例外をスローしました。connectStr)"stringMessage"Oracleクライアントのバージョンと互換性のないプロバイダです。タイプ初期化子が例外をスローしました。System.ComponentModel.Component.Finalize()"stringInnerException{"Oracleクライアントのバージョンと互換性のないプロバイダです。framework?)が、connectionをdisposeしようとして同様のエラーが発生していると思ってよいですよね。ちなみにこのエラーは、catchしてもアプリケーション終了しますが、このアプリ終了はキャンセルできないですよね。InnerException{"Oracleクライアントのバージョンと互換性のないプロバイダです。Clientを同じフォルダにインストールしちゃったとかいうことはないでしょうか。Frameworkは2.0、3.0、3.5あたりを指定していますよね。11.2.0.1.2になると思います。Client関連をアンインストールして再度インストールしなおせば解決しそうな気もします。本当はODPのバージョン以上のクライアントが必要みたいです。Guide」というPDFに書いてました。参照の追加で、Oracle.DataAccessは、2.102.2.20しか選択肢として現れないです。Readme」にはレジストリにバージョンが設定されていると書かれていますが、そのあたりの設定内容の影響もないでしょうか?同じエラーが発生する人も世の中にはいらっしゃるみたいですが、インストールの仕方か何かが災いしてるんでしょうかね。最後は再インストールかなと思いました。キャッチできても終了しちゃうエラーについてはわかりません。Oracle.DataAccess.Types;を設定。UID;try{con.Open();}catch{MessageBox.Show("データベースの接続に失敗しました。");}}MessageBox.Show("データベースの接続に成功しました。");}で接続成功します。