我偶尔会遇到这个例外,似乎无法在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
为什么在我明确创建交易时,是否会有可用的交易?
答案 0 :(得分:1)
我相信当客户端尝试使用的TCP端口被数据库服务器或客户端以外的代理关闭时,会发生这种情况。我们已经能够通过使用TCPView关闭客户端和服务器之间的端口1521上的所有连接,然后尝试在同一进程中打开连接来模拟这一点。在现实世界中,我们认为内部防火墙因不活动而关闭连接。但是,如果没有阻止连接被关闭,我还没有找到解决此问题的实际解决方案。
答案 1 :(得分:-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
对不起,我对“交易”了解不多,所以我可以提供帮助