3

時々この例外が発生し、これをデバッグする方法についていくつかの洞察を得ることができるSOやGoogle上で何かを見つけることができないようです。TransactionInterop.GetDtcTransaction()throw ArgsNullException ...時々

System.ArgumentNullException: Value cannot be null. 
Parameter name: transaction 
    at System.Transactions.TransactionInterop. 
         GetDtcTransaction(Transaction transaction) 
    at Oracle.DataAccess.Client.OracleConnection.Open() 
    at RetrieveMessage() ... 

マイコードはかなり簡単です。 RetrieveMessage()は、キューからメッセージをポップするための呼び出しですが、接続を開こうとするだけでは失敗するため、関連性はありません。

using (var scope = new TransactionScope(TransactionScopeOption.Required, 
              TimeSpan.FromMinutes(10))) 
{ 
    message = RetrieveMessage(); 
    // ... 
    scope.Complete(); 
} 

//... 

public Message RetrieveMessage() 
{ 
    using (var cnn = new OracleConnection(ConnString)) 
    { 
     cnn.Open(); //sometimes fails??? 
     //... execute a stored procedure that calls dbms_aq.dequeue() 
    } 
    //... return dequeued message or null if queue is empty 
} 

私の接続文字列は次のようになります。Data Source=abc;User ID=test1;Password=test1;Pooling=true;Validate Connection=True

ODP.NET:バージョン2.112.1.0、.NET Framework 3.5のSP0

なぜ私は「利用可能なトランザクションが存在しないだろう既に明示的に作成されていますか?

+0

これは完全なスタックですか、いくつかのフレームをスキップしましたか?どのバージョンのODP.NETを使用していますか?また、接続文字列を教えてもらえますか?あなたは取引参加が必要ですか? –

+0

'RetrieveMessage()'メソッドの本体を見ることができますか?いくつかの 'OracleConnection'インスタンスで' .Open() 'と書かれた行がなければなりません。そのインスタンスはどのように設定されていますか? –

+0

Simon、Jeppe、あなたがリクエストした情報を追加しました。追加のフレームは省略されており、接続文字列とODP.NETのバージョンがリストされています。 –

答えて

-1

それだけで、時には失敗した場合、このような何かしてみてください:それはすべてですので、私はこれが時に起こると信じて

+0

問題がある場合は、コメントしてください、downvoteではありません。 – m12

+0

私はあなたが答えに費やした努力を感謝しますが、私のコードは例外を投げているので、それは完全な解決策ではありません。また、私のようなタイトなスピン・ループを阻止する理由もありません。最悪の場合、あなたのコードは、CPUが現在書かれているようにスパイクする可能性があります。理想的には、私は例外の原因を理解し、シナリオを修正して1つも投げないようにしたいと思います。あなたの答えは下降声に値します....しかし、私はそれを残すでしょう。 –

+2

実際に投票メカニズムはここで奨励されています...コメントは投稿を改善するのに役立ちますが、必須ではないはずです。また、一般的に下向きの投票は、質問のポスターではなく、他のユーザーから来ていることに注意してください。だから、もしあなたがあなたが話題についてあまり知らないと認めることができれば、おそらく誰か他の人に任せておくことが最善のことです。 – RThomas

1

を助けることができる、私は、「取引」について多くを知らない

while (true){ 
    if (ConnString == null) 
     continue; 
    var cnn = new OracleConnection(ConnString); 
    if (cnn == null) 
     continue; 
    cnn.Open() 
    //... execute a stored procedure that calls dbms_aq.dequeue() 
    break; 
} 
//... return dequeued message or null if queue is empty 

申し訳ありませんがクライアントが使用しようとしているTCPポートは、データベースサーバーまたはクライアント以外のエージェントによって閉じられます。 TCPViewを使用して、クライアントとサーバー間のポート1521上のすべての接続を閉じ、同じプロセス内で接続を開こうとすることで、これをシミュレートできました。現実の世界では、内部ファイアウォールが非アクティブなために接続を閉鎖していると考えています。しかし、接続が閉じられないようにするのは難しいですが、私はまだこの問題の実際の解決策を見つけていません。