C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[26]: OracleClient接続のあとにODP接続でエラー発生


(過去ログ 90 を表示中)

[トピック内 27 記事 (1 - 20 表示)]  << 0 | 1 >>

■53459 / inTopicNo.1)  OracleClient接続のあとにODP接続でエラー発生
  
□投稿者/ たか (83回)-(2010/09/13(Mon) 21:35:08)

分類:[.NET 全般] 

C#,VS2010で、Oracleに接続するプログラムを書いています。
その中で.net標準ライブラリ("System.Data.OracleClient")で接続後に、ODPで接続すると
なぜか、TypeInitializationExceptionが発生してしまいます。

何か処理が抜けているのでしょうか。
ちなみに、ODPのあとに、.net標準ライブラリで実行してもエラーにはなりません。

以下、再現ソースです。

// プロバイダーの取得
DbProviderFactory provider = DbProviderFactories.GetFactory("System.Data.OracleClient"); ★.net標準ライブラリ

try
{
DbConnection conn = provider.CreateConnection();
conn.ConnectionString = "Data Source=xxx;User ID=ユーザーID;Password=パス";
conn.Open();

DbTransaction tran = conn.BeginTransaction();

tran.Commit();
tran.Dispose();
conn.Close();
conn.Dispose();
}
catch (SystemException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}

// プロバイダーの取得
DbProviderFactory provider2 = DbProviderFactories.GetFactory("Oracle.DataAccess.Client");  ★ODP

try
{
DbConnection conn = provider2.CreateConnection(); ←★ここでエラーが発生
conn.ConnectionString = "Data Source=xxx;User ID=ユーザーID;Password=パス";
conn.Open();

DbTransaction tran = conn.BeginTransaction();

tran.Commit();
conn.Close();
conn.Dispose();
}
catch (SystemException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}


'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしまし
た。
場所 Oracle.DataAccess.Client.OracleConnection..ctor()
場所 Oracle.DataAccess.Client.OracleClientFactory.CreateConnection()
場所 ConsoleApplication1.Program.Main(String[] args) 場所 D:\Listrante\Tool\D
ebugYou\ConsoleApplication1\ConsoleApplication1\Program.cs:行 39

ハンドルされていない例外: System.TypeInitializationException: 'Oracle.DataAccess
.Client.OracleConnection' のタイプ初期化子が例外をスローしました。 ---> Oracle.D
ataAccess.Client.OracleException Oracleクライアントのバージョンと互換性のないプ
ロバイダです。 場所 Oracle.DataAccess.Client.OracleInit.Initialize()
場所 Oracle.DataAccess.Client.OracleConnection..cctor()
--- 内部例外スタック トレースの終わり ---
場所 Oracle.DataAccess.Client.OracleConnection.Dispose(Boolean disposing)
場所 System.ComponentModel.Component.Finalize()

Oracle 10g Enterprise Edition Release 10.1.0.2.0
ODPのバージョンは、2.102.2.20


引用返信 編集キー/
■53464 / inTopicNo.2)  Re[1]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ すなふきぬ (39回)-(2010/09/14(Tue) 02:18:48)
No53459 (たか さん) に返信
> C#,VS2010で、Oracleに接続するプログラムを書いています。
> その中で.net標準ライブラリ("System.Data.OracleClient")で接続後に、ODPで接続すると
> なぜか、TypeInitializationExceptionが発生してしまいます。

> 'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしまし
> た。
> 場所 Oracle.DataAccess.Client.OracleConnection..ctor()
> 場所 Oracle.DataAccess.Client.OracleClientFactory.CreateConnection()
> 場所 ConsoleApplication1.Program.Main(String[] args) 場所 D:\Listrante\Tool\D
> ebugYou\ConsoleApplication1\ConsoleApplication1\Program.cs:行 39
>
> ハンドルされていない例外: System.TypeInitializationException: 'Oracle.DataAccess
> .Client.OracleConnection' のタイプ初期化子が例外をスローしました。 ---> Oracle.D
> ataAccess.Client.OracleException Oracleクライアントのバージョンと互換性のないプ
> ロバイダです。 場所 Oracle.DataAccess.Client.OracleInit.Initialize()
> 場所 Oracle.DataAccess.Client.OracleConnection..cctor()
> --- 内部例外スタック トレースの終わり ---
> 場所 Oracle.DataAccess.Client.OracleConnection.Dispose(Boolean disposing)
> 場所 System.ComponentModel.Component.Finalize()
>
> Oracle 10g Enterprise Edition Release 10.1.0.2.0
> ODPのバージョンは、2.102.2.20

まず、何が原因なのか切り分けていくのがいいと思います。
ODPの参照設定は正しくできていますか?
DbProviderFactoriesを使わないでODPを使用した場合、接続できますか?
システム内にバージョンの異なるODPがインストールされていませんか?

あと提示して頂いたソースだけでは判断できないのですが、connの変数名が同じなのが気になるかも。
> 場所 Oracle.DataAccess.Client.OracleConnection.Dispose(Boolean disposing)
どうもconnをDisposeしに行ってるっぽいんで、もし提示しているコードをそのまま流しているのであれば.NET標準ライブラリを使用しているコードをコメントするか、conn2のような名前に変更して例外が発生するかどうかも確認してみてください。
引用返信 編集キー/
■53465 / inTopicNo.3)  Re[2]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (84回)-(2010/09/14(Tue) 09:10:45)
No53464 (すなふきぬ さん) に返信
> ■No53459 (たか さん) に返信
>>C#,VS2010で、Oracleに接続するプログラムを書いています。
>>その中で.net標準ライブラリ("System.Data.OracleClient")で接続後に、ODPで接続すると
>>なぜか、TypeInitializationExceptionが発生してしまいます。
>
>>'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしまし
>>た。
>> 場所 Oracle.DataAccess.Client.OracleConnection..ctor()
>> 場所 Oracle.DataAccess.Client.OracleClientFactory.CreateConnection()
>> 場所 ConsoleApplication1.Program.Main(String[] args) 場所 D:\Listrante\Tool\D
>>ebugYou\ConsoleApplication1\ConsoleApplication1\Program.cs:行 39
>>
>>ハンドルされていない例外: System.TypeInitializationException: 'Oracle.DataAccess
>>.Client.OracleConnection' のタイプ初期化子が例外をスローしました。 ---> Oracle.D
>>ataAccess.Client.OracleException Oracleクライアントのバージョンと互換性のないプ
>>ロバイダです。 場所 Oracle.DataAccess.Client.OracleInit.Initialize()
>> 場所 Oracle.DataAccess.Client.OracleConnection..cctor()
>> --- 内部例外スタック トレースの終わり ---
>> 場所 Oracle.DataAccess.Client.OracleConnection.Dispose(Boolean disposing)
>> 場所 System.ComponentModel.Component.Finalize()
>>
>>Oracle 10g Enterprise Edition Release 10.1.0.2.0
>>ODPのバージョンは、2.102.2.20
>
> まず、何が原因なのか切り分けていくのがいいと思います。
> ODPの参照設定は正しくできていますか?
> DbProviderFactoriesを使わないでODPを使用した場合、接続できますか?
> システム内にバージョンの異なるODPがインストールされていませんか?
>
> あと提示して頂いたソースだけでは判断できないのですが、connの変数名が同じなのが気になるかも。
>> 場所 Oracle.DataAccess.Client.OracleConnection.Dispose(Boolean disposing)
> どうもconnをDisposeしに行ってるっぽいんで、もし提示しているコードをそのまま流しているのであれば.NET標準ライブラリを使用しているコードをコメントするか、conn2のような名前に変更して例外が発生するかどうかも確認してみてください。
引用返信 編集キー/
■53466 / inTopicNo.4)  Re[3]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (85回)-(2010/09/14(Tue) 09:13:14)
(*)間違い送信してしまいました。申し訳ございません。

つきあっていただいてありがとうございます。
ある程度、切り分けはできている状態ではあるのですが。

>まず、何が原因なのか切り分けていくのがいいと思います。
>ODPの参照設定は正しくできていますか?
提示のコードでは、DbProviderFactoryによる抽象クラスによるコーディングなので
ODP、.net標準ライブラリの参照設定は行っていません。

>DbProviderFactoriesを使わないでODPを使用した場合、接続できますか?
できます。
.net標準だけ → OK
ODPだけ → OK
ODP実行のあとに.net標準 → OK
.net標準のあとにODP実行 → エラー!
という状況です。

>システム内にバージョンの異なるODPがインストールされていませんか?
GACのOracle.DataAccessを確認したところ↓がインストールされています。
10.1.0.200
10.1.0.400
2.102.2.20

>あと提示して頂いたソースだけでは判断できないのですが、connの変数名が同じなのが気になるかも。
> 場所 Oracle.DataAccess.Client.OracleConnection.Dispose(Boolean disposing)
>どうもconnをDisposeしに行ってるっぽいんで、もし提示しているコードをそのまま流しているのであれば.NET標準ライブラ>リを使用しているコードをコメントするか、conn2のような名前に変更して例外が発生するかどうかも確認してみてくださ>い。
conn2も試したところ同様の結果でした。

実際のコードは同じソースで、パラメータのみ切り替えて使用しています。
提示のコードは、それを再現する最小限のソースコードを書いたというものです。
最小限のソースコードで再現するので、提示コードの中(あるいは環境?)に問題があるのは間違いなさそうです。

一応、DbProviderFactoriesを使わない、変数を使いまわししないソースコード(↓参照)で
記述してみましたが、同様のエラーが発生します。

// @.net標準
try
{
System.Data.OracleClient.OracleConnection conn = new System.Data.OracleClient.OracleConnection();
conn.ConnectionString = "Data Source=TESTDB;User ID=sa;Password=pass";
conn.Open();

DbTransaction tran = conn.BeginTransaction();

tran.Commit();
tran.Dispose();
conn.Close();
conn.Dispose();
}
catch (SystemException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}


// AODP
try
{
Oracle.DataAccess.Client.OracleConnection conn2 = new Oracle.DataAccess.Client.OracleConnection();
conn2.ConnectionString = "Data Source=TESTDB;User ID=sa;Password=pass";
conn2.Open();

DbTransaction tran2 = conn2.BeginTransaction();

tran2.Commit();
tran2.Dispose();
conn2.Close();
conn2.Dispose();
}
catch (SystemException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}

引用返信 編集キー/
■53483 / inTopicNo.5)  Re[4]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ すなふきぬ (41回)-(2010/09/14(Tue) 19:46:01)
No53466 (たか さん) に返信
> (*)間違い送信してしまいました。申し訳ございません。
>
> つきあっていただいてありがとうございます。
> ある程度、切り分けはできている状態ではあるのですが。

了解です。では、もう少し掘り下げて調べていくしかないですね。

> ODP、.net標準ライブラリの参照設定は行っていません。

> >システム内にバージョンの異なるODPがインストールされていませんか?
> GACのOracle.DataAccessを確認したところ↓がインストールされています。
> 10.1.0.200
> 10.1.0.400
> 2.102.2.20

これらのDLLを明示的に参照設定させてODP接続した際、問題となっているような現象は発生しますか?
引用返信 編集キー/
■53485 / inTopicNo.6)  Re[5]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (86回)-(2010/09/14(Tue) 21:50:32)
>>>システム内にバージョンの異なるODPがインストールされていませんか?
>>GACのOracle.DataAccessを確認したところ↓がインストールされています。
>>10.1.0.200
>>10.1.0.400
>>2.102.2.20
>
> これらのDLLを明示的に参照設定させてODP接続した際、問題となっているような現象は発生しますか?
No.53466で再度提示しましたソースが、明示的にODPと.net標準ライブラリを参照したソースで、
同様な現象が発生します。

また、参照の追加で、Oracle.DataAccessは、2.102.2.20しか選択肢として現れないです。

引用返信 編集キー/
■53492 / inTopicNo.7)  Re[6]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ なし (13回)-(2010/09/15(Wed) 09:48:30)
No53485 (たか さん) に返信
環境はないのですが、興味があるので確認させてください。

環境のある別の人も同じエラーが発生するんでしょうか?

以下のコードでもエラーが発生するんでしょうか?
(エラーは同様と書かれましたが、TypeInitializationExceptionですか?)
それとも再現条件にはOpenやTransactionも必要なんでしょうか?

using (var conn = new System.Data.OracleClient.OracleConnection())
{
//conn.ConnectionString = "Data Source=TESTDB;User ID=sa;Password=pass";
//conn.Open();
}
using (var conn = new Oracle.DataAccess.Client.OracleConnection())
{
}

もしこれでエラーが発生するんでしたら、オラクルに問い合わせたほうがいいかもしれないと思いました。
ただし、普通は2つのプロバイダを使う必要性はないと思うので、どうしてそうされているのかも興味があります。
もしかして、プロバイダが異なるEXEを続けて実行した場合にもエラーが発生したりするんでしょうか?

だめもとですが、2つめのusingの前でGC.Collect()を実行しても変わらないでしょうか?
Open不要な場合は関係ないですが、1つめの接続でPoolingを無効にしても同じでしょうか?

引用返信 編集キー/
■53493 / inTopicNo.8)  Re[7]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (87回)-(2010/09/15(Wed) 10:51:30)
お付き合いくださり、ありがとうございます。

> 以下のコードでもエラーが発生するんでしょうか?
> using (var conn = new System.Data.OracleClient.OracleConnection())
> {
> //conn.ConnectionString = "Data Source=TESTDB;User ID=sa;Password=pass";
> //conn.Open();
> }
> using (var conn = new Oracle.DataAccess.Client.OracleConnection())
> {
> }
上記ケースは、さすがに発生しませんでした。

> それとも再現条件にはOpenやTransactionも必要なんでしょうか?
このusingの間に↓をいれると同じエラーが発生します。
conn.ConnectionString = "Data Source=xxx;User 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を無効にしても同じでしょうか?
以下のようにしましたが、やはり同じエラーが発生しました。
conn.ConnectionString = "Data Source=xxx;Pooling=false;User ID=ユーザーID;Password=パス";


引用返信 編集キー/
■53498 / inTopicNo.9)  Re[8]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ なし (14回)-(2010/09/15(Wed) 13:58:11)
No53493 (たか さん) に返信
"ODP TypeInitializationException"でググったりgooglingすると、
.configでのバージョンのリダイレクト指定で回避できてるようです。

http://otn.oracle.co.jp/forum/thread.jspa?messageID=35035966
http://forums.oracle.com/forums/thread.jspa?threadID=406066

どちらもプロバイダを切り替える話ではないようですが、一度試されてはいかがですか?

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342"/>
<bindingRedirect oldVersion="2.102.2.20" newVersion="10.1.0.400"/>
</dependentAssembly>
</assemblyBinding>
</runtime>

想像ですが、もしこれで直るとすると、
System.Data.OracleClientがロードしたバージョンとは別のバージョンを
ODPが使おうとしてロードに失敗してるのかなと思いました。
引用返信 編集キー/
■53500 / inTopicNo.10)  Re[9]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (88回)-(2010/09/15(Wed) 15:44:58)
><bindingRedirect oldVersion="2.102.2.20" newVersion="10.1.0.400"/>
↑を試したところ、少し状況が変わりました。

new Oracle.DataAccess.Client.OracleConnection()
↑で落ちていたのが、

コネクションオープン後の、BeginTransaction()で落ちるようになりました。
newされたコネクションを見てみると、stateがClosedで、Openしているのに
開けていないようです。

1歩前進したような気がします。

引用返信 編集キー/
■53501 / inTopicNo.11)  Re[10]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ なし (15回)-(2010/09/15(Wed) 18:52:35)
No53500 (たか さん) に返信
> newされたコネクションを見てみると、stateがClosedで、Openしているのに
> 開けていないようです。

newされたコネクションはOpenするまでClosedなのは正常だと思いますが、
OpenしてもstateがClosedのままということですか?

> コネクションオープン後の、BeginTransaction()で落ちるようになりました。

今は以下のコードのような状況ですね?
例外が発生せずに落ちちゃうんですか?
「10.1.0.400」のところを「10.1.0.200」にしても同じでしょうか?

using (var conn = new System.Data.OracleClient.OracleConnection())
{
    conn.ConnectionString = "Data Source=TESTDB;User ID=ユーザーID;Password=パス";
    conn.Open();
}
using (var conn = new Oracle.DataAccess.Client.OracleConnection()) // ここは大丈夫で、
{
    conn.ConnectionString = "Data Source=TESTDB;User ID=ユーザーID;Password=パス";
    conn.Open();
    using (var tran = conn.BeginTransaction())  // ここでエラー発生?異常終了?
    {
    }
}

引用返信 編集キー/
■53504 / inTopicNo.12)  Re[11]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (89回)-(2010/09/15(Wed) 22:43:04)
> newされたコネクションはOpenするまでClosedなのは正常だと思いますが、
> OpenしてもstateがClosedのままということですか?
そうです。なぜか、OpenしてもClosedのままです。

>>コネクションオープン後の、BeginTransaction()で落ちるようになりました。
>
> 今は以下のコードのような状況ですね?
はい。再現コードをそのまま乗せるとこんな感じです。

try
{
using (System.Data.OracleClient.OracleConnection conn = new System.Data.OracleClient.OracleConnection())
{
conn.ConnectionString = "Data Source=TESTDB;User ID=ユーザーID;Password=パス";
conn.Open();

using (DbTransaction tran = conn.BeginTransaction())
{
tran.Commit();
}
conn.Close();
}
}
catch (SystemException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
// ここまでOK

// AODP
try
{
using (Oracle.DataAccess.Client.OracleConnection conn2 = new Oracle.DataAccess.Client.OracleConnection()) // 元々はここでエラー
{
conn2.ConnectionString = "Data Source=TESTDB;User ID=ユーザーID;Password=パス";
conn2.Open();

using (DbTransaction tran2 = conn2.BeginTransaction()) // bindingRedirectするとここでエラー。コネクションはClosed状態
{
tran2.Commit();
}
conn2.Close();
}
}
catch (SystemException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}

> 例外が発生せずに落ちちゃうんですか?
> 「10.1.0.400」のところを「10.1.0.200」にしても同じでしょうか?
結果はかわらず、BeginTransactionで以下のエラーでした。(StateがClosedのため?)
[System.NullReferenceException] = {"オブジェクト参照がオブジェクト インスタンスに設定されていません。"}

指定は以下のように行っています。
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342"/>
<bindingRedirect oldVersion="2.102.2.20" newVersion="10.1.0.400"/> → あるいは 10.1.0.400を10.1.0.200
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

引用返信 編集キー/
■53526 / inTopicNo.13)  Re[12]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ すなふきぬ (42回)-(2010/09/16(Thu) 22:39:36)
No53504 (たか さん) に返信
>>newされたコネクションはOpenするまでClosedなのは正常だと思いますが、
>>OpenしてもstateがClosedのままということですか?
> そうです。なぜか、OpenしてもClosedのままです。

一昨日から急に出張が決まって、レスできなくて申し訳ありません。なしさんフォローありがとうございます。
この2日の間にかなりの進展があって良かったです。

OpenしているのにStateがClosedってことは、正常にOpenできてないみたいですね。
不具合の発生する環境には、複数のOracleClientが同居してたと思うのですが、tnsの設定は両方ともされていますか?
引用返信 編集キー/
■53534 / inTopicNo.14)  Re[13]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (90回)-(2010/09/17(Fri) 11:33:55)
> 一昨日から急に出張が決まって、レスできなくて申し訳ありません。なしさんフォローありがとうございます。
> この2日の間にかなりの進展があって良かったです。
すいません、私こそ、みなさんフォローありがとうございます。

> OpenしているのにStateがClosedってことは、正常にOpenできてないみたいですね。
> 不具合の発生する環境には、複数のOracleClientが同居してたと思うのですが、tnsの設定は両方ともされていますか?
↓がインストールされています、それぞれ以下フォルダ配下です。
10.1.0.200 d:\oracle\product\10.1.0\Client_1
10.1.0.400 d:\oracle\product\10.1.0\Db_1
2.102.2.20 d:\oracle\product\10.2.0\Db_1
で、それぞれ、まったく同じtnsが設定されています。

>>コネクションオープン後の、BeginTransaction()で落ちるようになりました。
すいません、↑で落ちる件は、.net標準ライブラリでつながないで、ODP単体で実行しても発生しました。
どうも、フリダシに戻ってしまったようです。

ためしに、10.1.0.200、10.1.0.400のOracle.DataAccess.dllをGACからアンインストールしてみました。
これでアセンブリを間違って使うこともないかと思いましたが
結果は、↓の最初と同じエラーで変わらずでした。
'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしました

ODP単体で動作することから、.net標準ライブラリの後始末ができていないように見えます。
ちなみにこれは、みなさんの環境でも発生するのでしょうか。

引用返信 編集キー/
■53553 / inTopicNo.15)  Re[14]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ はつね (1318回)-(2010/09/18(Sat) 00:14:07)
No53534 (たか さん) に返信

app.configに

 <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" culture="neutral" publicKeyToken="89B483F429C47342" />
        <publisherPolicy apply="no" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

とかかいて、バージョンポリシーによるバージョンリダイレクトが起こらないように
すればいいんじゃ?

引用返信 編集キー/
■53608 / inTopicNo.16)  Re[15]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ なし (16回)-(2010/09/20(Mon) 20:16:09)
No53534 (たか さん) に返信
環境を作って試そうとしたんですが、結局、中途半端な検証になっちゃいました。
バージョンも違うし、2バージョン入れることもできませんでした。
ただ1つわかったこととしては、
「10.2.0.100」と「2.102.2.20」の混在では、エラーは発生しないようです。

試したこと・・・
・XPのインストール
・Visual Studio 2010 Express C#
・.NET Framework 3.5

・Oracle Database 10g Client Release 2 (10.2.0.1.0) のインストール

Oracle Database Extensions for .NET 10.2.0.1.0 が選択されるように、
「管理者」を選択してインストールすると、
GACには「Oracle.DataAccess 10.2.0.100」が追加されました。
参照設定の「参照」のタブで、「bin」のフォルダの
「Oracle.DataAccess.dll」を指定して再現コードを実行しても、
エラーなく正常実行できました。

・Oracle 10g Release 2 ODAC 10.2.0.2.21 (without OTD) のインストール

GACには上記に加え、「1.102.2.20」と「2.102.2.20」が追加されました。
参照設定の「参照」のタブで、「ODP.NET\bin\2.x」のフォルダの
「Oracle.DataAccess.dll」を指定して再現コードを実行しても、
エラーなく正常実行できました。
(参照設定の「.NET」のタブには「Oracle.DataAccess」は表示されませんでした。??)

・Oracle Database 10g Release 2 (10.2.0.3/10.2.0.4) のインストール

Windows Vistaとか書いているためか、
「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

はつねさんので解決しますように。

引用返信 編集キー/
■53641 / inTopicNo.17)  Re[16]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか (91回)-(2010/09/21(Tue) 19:54:55)
はつね さん、ありがとうございます。
<publisherPolicy apply="no" />〜
は試したのですが、やはり同様のエラーでした。

なしさん、検証までしていただいてありがとうございます。
申しわけなくなってきました。

こちらでも、私以外の環境で試してみたのですが
Oracle11gインストールのみをインストールした↓の環境では、エラーが発生しませんでした。
1.111.6.0
2.111.6.0

これから、10g系のODPのバグ?かと思っていましたが
なしさんの環境だと、ほぼ私と同じ環境で、エラー再現しないのですね。
ますますわからなくなってきました。

ところで、追加で情報なのですが、connectionのnewの例外の後に
もう1つ例外が発生します。
(これは再現コードでは再現せず、Windowsアプリでのみ発生します)
-------------------------------------------------------------------------------------------------------------------
■最初のエラー
Message	"'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしました。"	string
場所 Oracle.DataAccess.Client.OracleConnection..ctor()\r\n
場所 Oracle.DataAccess.Client.OracleClientFactory.CreateConnection()\r\n   
場所 Listrante.Common.Db.TransactionManager.ConnectTest(ProviderKind kind, String connectStr)"	string

Message	"Oracleクライアントのバージョンと互換性のないプロバイダです。"	string
		StackTrace	
場所 Oracle.DataAccess.Client.OracleInit.Initialize()\r\n   
場所 Oracle.DataAccess.Client.OracleConnection..cctor()"	string

-------------------------------------------------------------------------------------------------------------------
■2回目のエラー
Message	"'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしました。"	string
StackTrace	
場所 Oracle.DataAccess.Client.OracleConnection.Dispose(Boolean disposing)\r\n
場所 System.ComponentModel.Component.Finalize()"	string


InnerException	{"Oracleクライアントのバージョンと互換性のないプロバイダです。"}
	System.Exception {Oracle.DataAccess.Client.OracleException}
StackTrace	
"   場所 Oracle.DataAccess.Client.OracleInit.Initialize()\r\n
   場所 Oracle.DataAccess.Client.OracleConnection..cctor()"	string

-------------------------------------------------------------------------------------------------------------------
2回目のエラーは、別スレッド(.net framework?)が、connectionをdisposeしようとして
同様のエラーが発生していると思ってよいですよね。

ちなみにこのエラーは、catchしてもアプリケーション終了しますが、このアプリ終了はキャンセルできないですよね。

引用返信 編集キー/
■53656 / inTopicNo.18)  Re[17]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ はつね (1320回)-(2010/09/22(Wed) 12:54:47)
No53641 (たか さん) に返信
> InnerException {"Oracleクライアントのバージョンと互換性のないプロバイダです。"}

ODP.NETってどうやっていれましたか?
またそのあとでODP.NET以外のOracleClient関連を削除とかしてませんか?
バージョン違うOracle Clientを同じフォルダにインストールしちゃったとか
いうことはないでしょうか。

VS2010とのことですが.NET Frameworkは2.0、3.0、3.5あたりを指定していま
すよね。.NET Framework 4用だとOracle 11g Release 2 ODAC 11.2.0.1.2に
なると思います。

なんかODP.NETも含めOracle Client関連をアンインストールして再度インストー
ルしなおせば解決しそうな気もします。
引用返信 編集キー/
■53661 / inTopicNo.19)  Re[18]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ なし (17回)-(2010/09/22(Wed) 16:07:58)
No53641 (たか さん) に返信
エラーが発生するのは.NET標準での接続の後だけ、ということは説明できませんが、
オラクルクライアント「10.1.x」の環境にODP「2.102.x」(10.2用)を入れられてますけど、
本当はODPのバージョン以上のクライアントが必要みたいです。
「Oracle Data Provider for .NET Developer's Guide」というPDFに書いてました。
「Oracle 10g ODAC 10.1.0.4.0」というのがあるんですが、
これだと大丈夫だったりしないでしょうか?

それと、
> また、参照の追加で、Oracle.DataAccessは、2.102.2.20しか選択肢として現れないです。
と書かれた件ですが、
ファクトリーを使わない方法で、参照の追加の「参照」タブから
「d:\oracle\product\10.1.0\Db_1\bin」フォルダにある
「Oracle.DataAccess.dll」を指定しても同じでしょうか?

スタートメニューの「Application Development」の
「Oracle Data Provider for .NET Readme」には
レジストリにバージョンが設定されていると書かれていますが、
そのあたりの設定内容の影響もないでしょうか?

同じエラーが発生する人も世の中にはいらっしゃるみたいですが、
インストールの仕方か何かが災いしてるんでしょうかね。
やっぱり最後は再インストールかなと思いました。

キャッチできても終了しちゃうエラーについてはわかりません。
Application.ThreadExceptionや、AppDomain.CurrentDomain.UnhandledExceptionで、
さらにキャッチできる状態でしょうか?

引用返信 編集キー/
■53686 / inTopicNo.20)  Re[19]: OracleClient接続のあとにODP接続でエラー発生
 
□投稿者/ 裕猫 (181回)-(2010/09/24(Fri) 09:03:37)
わたしも同じ環境でoracleに接続していますが、参照を使っているので参考になるかどうかわかりませんが
参照でOracle.DataAccessを参照し

using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
を設定。

public static string UID = "User ID=ユーザーID;Password=パス;Data Source=xxx";
public static void MKT(string DB名)
{
using (OracleConnection con = new OracleConnection())
{
con.ConnectionString = UID;
try
{
con.Open();
}
catch
{
MessageBox.Show("データベースの接続に失敗しました。");
}
      }
MessageBox.Show("データベースの接続に成功しました。");
}

で接続成功します。一度参照を入れてやってみたらどうでしょうか?
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -