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 回答