3

私は時々この例外を受け取ります.SOまたはGoogleで、これをデバッグする方法について洞察を得ることができるものを見つけることができないようです.

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

すでにトランザクションを明示的に作成しているのに、トランザクションが利用できないのはなぜですか?

4

2 に答える 2

1

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

于 2013-08-16T14:49:45.723 に答える
-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

申し訳ありませんが、私は「トランザクション」についてあまり詳しくないので、それが私がお手伝いできるすべてです

于 2012-05-14T23:32:12.190 に答える