Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TransactionInterop.GetDtcTransaction()引发ArgumentNullException。。。有时_C#_Oracle_Transactions_Transactionscope_Distributed Transactions - Fatal编程技术网

C# TransactionInterop.GetDtcTransaction()引发ArgumentNullException。。。有时

C# TransactionInterop.GetDtcTransaction()引发ArgumentNullException。。。有时,c#,oracle,transactions,transactionscope,distributed-transactions,C#,Oracle,Transactions,Transactionscope,Distributed Transactions,我偶尔会遇到这样的异常情况,而且似乎在SO或google上找不到任何可以帮助我深入了解如何调试的东西 System.ArgumentNullException: Value cannot be null. Parameter name: transaction at System.Transactions.TransactionInterop. GetDtcTransaction(Transaction transaction) at

我偶尔会遇到这样的异常情况,而且似乎在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;用户ID=test1;密码=test1;池=真;验证连接=真

ODP.NET:版本2.112.1.0、.NET Framework 3.5 SP0


如果我已经显式创建了一个事务,为什么没有可用的事务呢?

如果它只是偶尔失败,请尝试以下操作:

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上的所有连接,然后尝试在同一进程中打开连接来模拟这种情况。在现实世界中,我们认为内部防火墙由于不活动而关闭连接。除了防止连接关闭之外,我还没有找到解决这个问题的实际方法。

这是完整的堆栈还是跳过了一些帧?您使用的ODP.NET版本是什么?另外,你能给我们你的连接字符串吗?您需要事务登记吗?我们可以查看
RetrieveMessage()
方法的主体吗?在某些
OracleConnection
实例上,必须有一行写着
.Open()
。那个实例是如何设置的?Simon,Jeppe,我已经添加了您要求的信息。没有遗漏任何其他帧,我已经列出了我的连接字符串和ODP.NET版本。我感谢您的回答,但我的代码引发了一个异常,因此这不是一个完整的解决方案。此外,我没有理由在这样一个紧密的旋转循环中阻塞——最坏的情况是,您的代码可能会以当前编写的方式阻塞CPU。理想情况下,我希望了解异常的原因并修复该场景,这样它就不会抛出异常。你的答案值得投反对票。。。。但我不说了。实际上m12这里鼓励投票机制。。。虽然评论有助于改进帖子,但不应被认为是强制性的。还要记住,通常否决票来自其他用户,而不是问题的海报。这里有很多专家,所以如果你可以承认你对某个话题不太了解,那么最好还是留给其他人去做——或者准备接受落选。