开门见山,使用MS Enterprise Library的DAAB(Data Access Application Block)获取数据时抛出异常。具体场景如下,通过Database对象的ExecuteReader执行两段Select语句,前一句是不合法的,后一句是正确的。为了避免第一次执行出错导致程序的终止,特意将其放到Try/Catch酷快中。两次数据库操作通过TrsanctionScope的形式纳入同一个Transaction中,具体的代码如下所示。

   1: class Program
   2: {
   3:     static void Main()
   4:     {
   5:  
   6:         string invalidSql = "SELECT * FROM {InvalidTable}";
   7:         string validSql = "SELECT * FROM {ValidTable}";
   8:  
   9:  
  10:         Database db = DatabaseFactory.CreateDatabase();
  11:         using (TransactionScope scope = new TransactionScope())
  12:         {
  13:             DbCommand commandWithInvalidSql = db.GetSqlStringCommand(invalidSql);
  14:             DbCommand commandWithValidSql = db.GetSqlStringCommand(validSql);
  15:  
  16:             try
  17:             {
  18:                 db.ExecuteReader(commandWithInvalidSql);
  19:             }
  20:             catch
  21:             { }
  22:  
  23:             db.ExecuteReader(commandWithValidSql);
  24:         }
  25:     }
  26: } 

但是在执行第二个ExecuteReader方法的时候却抛出如下一个InvalidOperationException(如下图),错误消息为:“ExecuteReader requires an open and available Connection. The connection's current state is closed.”

原因出在这里:在ExecuteReader中,相应的ADO.NET代码放在try|catch中,当异常抛出后,相应的DbConnect会被关闭。但是由于在我的代码中,两次ExecuteReader的调用是在一个相同的Ambient Transaction中执行的,DAAB在内部采用相同的DbTransaction执行这两项操作,当执行第一项操作时,由于出现异常导致DbConnect关闭,使用相同DbConnect的第二项操作肯定会失败。

   1: public virtual IDataReader ExecuteReader(DbCommand command)
   2: {
   3:     ConnectionWrapper wrapper = GetOpenConnection(false);
   4:  
   5:     try
   6:     {
   7: //
   8: // JS-L: I moved the PrepareCommand inside the try because it can fail.
   9: //
  10: PrepareCommand(command, wrapper.Connection);
  11:  
  12: //
  13: // If there is a current transaction, we'll be using a shared connection, so we don't
  14: // want to close the connection when we're done with the reader.
  15: //
  16: if (Transaction.Current != null)
  17:     return DoExecuteReader(command, CommandBehavior.Default);
  18: else
  19:     return DoExecuteReader(command, CommandBehavior.CloseConnection);
  20:     }
  21:     catch
  22:     {
  23: wrapper.Connection.Close();
  24: throw;
  25:     }
  26: } 
  27:  

我不清楚微软在设计的时候,是因为没有考虑到这种场景呢,还是不得以而为之,或者是出于其他因素的考虑,大家有何见解。


作者:Artech
出处:http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Is this a MS EnterLib DAAB BUG or not?相关推荐

  1. .Net 1.1下WEB引用Win控件的两个Bug

    1.WEB系统引用windows控件的方式来实现页面打印的功能,一直使用比较正常,有一天更新后部分机器不能正常加载控件.后来分析的N久,发现是打印控件上我加了一个Label,使用了Arial Blac ...

  2. 自定义安装MS Office Project2007会出错

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天使用虚拟光驱文件自定义安装MSOffice Project2007,如下图: 然后总是出现一个错误: 从网上找来一 ...

  3. ASP.Net中无刷新执行Session身份验证

    在写一个客户的B/S结构应用程序时,突然发现一个技巧,不知道是否是MS的一个BUG,给相关的有研究的朋友原先考虑写一个检查Session的类,Session失效后,必须转向登陆页面,可每一个调用该类的 ...

  4. 服务器检测到恶意发送文件,微软认证:文件服务器上与恶意文件夹的战争

    单位里存在着一些不良分子,给了服务器某个文件夹完全权限吧,就给你搞特殊!!! 里面放些让我们这些管理者都看不到的东东!!!难道真的是这么是别人说的删不了和看不了麽!错啦,请记住在企业里谁在这方面说了算 ...

  5. EnterLib PIAB又一个BUG?

    在<这是EnterLib PIAB的BUG吗?>一文中我们讨论了PIAB关于抽象基类的BUG,今天又发现了一个新的问题.问题的起因源于<IoC+AOP的简单实现>这篇文章,因为 ...

  6. 这是EnterLib PIAB的BUG吗?

    在默认的情况下,EnterLib的PIAB采用基于TransparentProxy/RealProxy的机制实现对方法调用的拦截,进而实现了对横切关注点(Crosscutting Concern)的动 ...

  7. 再谈borland与MS对BUG的不同态度~

    在讨论Delphi 6 SP1对BUG的修补问题时(http://www.delphibbs.com/delphibbs/dispq.asp?lid=648516),我提及"强烈建议Borl ...

  8. [MS bug]安装SQL Server 2008 错误:is not a valid login or you do not have permission

    环境: Windows 7 sp1 x64. 问题描述: 安装到几乎要完成的时候爆出:is not a valid login or you do not have permission.安装失败. ...

  9. 一个GDIPlus的Bug -- OutofMemory异常

    今天发现 framework2.0中的一个GDIPlus的Bug: 在Form的OnPaint事件里面写如下代码: private void Form1_Paint(object sender, Pa ...

最新文章

  1. 经典爬虫:用Scrapy爬取百度股票
  2. MariaDB 修改存储路径后启动失败问题解决
  3. 网络推广外包中如何让网络推广外包专员充分运用网站的市场价值?
  4. ABAP CHECKBOX 和LISTBOX使用指南
  5. MoSCow和Kano
  6. 渐进式web应用程序_如何在渐进式Web应用程序中添加到主屏幕
  7. 面向对象编程其实很简单——Python 面向对象(初级篇)
  8. 扩展Python模块系列(二)----一个简单的例子
  9. python url拼接_python学习笔记——urllib篇
  10. httpservletrequest_HttpServletResponse和HttpServletRequest取值的2个坑你知道吗?
  11. 1 元购买 1000+ 册爆款电子书,错过再等一年!
  12. APE到底比MP3文件“好听”多少
  13. 可视化大屏|2022年最值得推荐的10款可视化软件
  14. Atitit Data Matrix dm码的原理与特点
  15. 数字化转型中平台思维的十大要素-《数字化转型的道与术》
  16. C#:DataTable 操作
  17. Word文档导出(使用固定模板)
  18. 最高效的学习方法——逆向学习法
  19. 《JavaScript 的诞生》
  20. DSP模块之:EDMA

热门文章

  1. Clojure入门教程: Clojure – Functional Programming for the JVM中文版
  2. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
  3. Web自动化测试 Selenium+Eclipse+Junit+TestNG+Python
  4. Python 文件写操作
  5. 初学SSH 配置+错误总结
  6. CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数...
  7. webpack学习(七)打包压缩图片
  8. hdu 4496 并查集 逆向 并查集删边
  9. 昂靠的由来[本博作者爆料]
  10. Spring+ehcache缓存实例