【发布时间】:2012-04-30 18:28:30
【问题描述】:
我偶尔会遇到此异常,并且似乎无法在 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
我已经明确创建了一个事务,为什么没有可用的事务?
【问题讨论】:
-
这是完整的堆栈还是您跳过了一些帧?您使用的是什么版本的 ODP.NET?另外,你能给我们你的连接字符串吗?你需要交易登记吗?
-
我们能看到
RetrieveMessage()方法的主体吗?在某些OracleConnection实例上必须有一行显示.Open()。该实例是如何设置的? -
Simon,Jeppe,我已添加您要求的信息。没有省略额外的帧,我列出了我的连接字符串和 ODP.NET 版本。
标签: c# oracle transactions transactionscope distributed-transactions