解决.NET使用TransactionScope,操作多个oracle数据库时报6107错误

这几天想使用MS Enterprise Library3.1做一个持久化层包装,想使用MS的TransactionScope解决多数据库事务问题,我使用的是Oracle,但调试代码时,打开一个数据库操作没有问题,但打开第二个数据库时总数报6107错误(使用的是9i);

思考是不是数据库太老了,今天又安装了10g,但依然报6107错误,思考是不是权限没有设置造成的,于是找到Oracle目录(我的是10g,oracle/product/10.2.0),右键属性 -> 安全,添加Authenticated Users用户,点选“读取和运行”的允许为不选中,但点选选中它,单击“高级”查看一下权限选项的“应用于”是不是设置为“该文件夹,子文件夹及文件”,然后应用 -> 确定;

再次启动调试,运行成功;

但还有一个问题没有解决,就是调试时间稍微长点,Enterprise Library中的TransactionScopeConnection就要执行认为事务执行成功,执行OnTransactionCompleted委托事件,并释放了所有数据库连接对象;

其实我已经改造了Database 类,不让他执行完 DbCommand 后关闭数据库连接对象;

在网上搜了一下,找到几篇的文章;

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=883692&SiteID=1

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=323845&SiteID=1

http://www.cnblogs.com/dreamstec/archive/2007/09/16/894709.html

http://www.cnblogs.com/cn_wpf/archive/2007/08/08/844766.html (这篇不错)

看来MS的TransactionScope问题还比较多,实际使用时要慎重了;

不知道使用Oracle自己的ODP.NET效果怎么样,改天试试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的使用TransactionScope的代码示例,用于演示如何将多个数据库操作包装在一个事务中: ``` using System; using System.Data.SqlClient; using System.Transactions; class Program { static void Main() { // 创建一个连接字符串 string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=TestDB;Integrated Security=True"; // 创建一个事务范围对象 using (TransactionScope scope = new TransactionScope()) { try { // 执行第一个数据库操作 using (SqlConnection connection1 = new SqlConnection(connectionString)) { connection1.Open(); SqlCommand command1 = new SqlCommand("INSERT INTO Customers (Name) VALUES ('Customer 1')", connection1); command1.ExecuteNonQuery(); } // 执行第二个数据库操作 using (SqlConnection connection2 = new SqlConnection(connectionString)) { connection2.Open(); SqlCommand command2 = new SqlCommand("INSERT INTO Orders (CustomerId, OrderDate) VALUES ((SELECT TOP 1 Id FROM Customers ORDER BY Id DESC), GETDATE())", connection2); command2.ExecuteNonQuery(); } // 提交事务 scope.Complete(); } catch (Exception ex) { // 回滚事务 Console.WriteLine("Transaction rolled back: " + ex.Message); } } } } ``` 在这个示例中,我们使用TransactionScope类来创建一个事务范围,然后在这个范围内执行了两个数据库操作。如果两个操作都成功执行,我们调用了TransactionScope的Complete方法来提交事务。如果其中任何一个操作失败,我们就会在catch块中回滚事务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值