Codematic的mysqlhelper问题

      Codematic,我想有一部分朋友应该用过,我最近使用CodematicDemoS3这个项目中的mysql数据库帮助类,但发现在处理数据库连接以及异常上有比较明显的错误,不知道是我下载的这个版本问题还是Codematic一直都这么写数据库操作类。
  
     大家看下类似如下代码,代码并不一定完成相同,但类似的问题是相同的(可以去下载一个来查找类似代码),能看出问题来吗?
    

  ///   <summary>
        
///  执行一条计算查询结果语句,返回查询结果(object)。
        
///   </summary>
        
///   <param name="SQLString"> 计算查询结果语句 </param>
        
///   <returns> 查询结果(object) </returns>
         public   static   object  GetSingle( string  SQLString,  params  MySqlParameter[] cmdParms)
        {
            
using  (MySqlConnection connection  =   new  MySqlConnection(connectionString))
            {
                
using  (MySqlCommand cmd  =   new  MySqlCommand())
                {
                    
try
                    {
                        PrepareCommand(cmd, connection, 
null , SQLString, cmdParms);
                        
object  obj  =  cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                        
if  ((Object.Equals(obj,  null ))  ||  (Object.Equals(obj, System.DBNull.Value)))
                        {
                            
return   null ;
                        }
                        
else
                        {
                            
return  obj;
                        }
                    }
                    
catch  (MySql.Data.MySqlClient.MySqlException e)
                    {
                        
throw  e;
                    }
                }
            }
        }

        
        我刚开始使用这个帮忙类时,也没看它的源码,但发现有些情况下,数据库连接不自动关闭,调试之后,决定定位源码查看原因,就发现类似上面的代码,在程序发生异常时,帮助类直接向外抛异常,这就导致打开的数据库连接不能关闭,如果是一个轮询查询,每次都不关闭数据库连接,不出一会,你的数据库就too many conn了。我实在是不能理解,在这个开源项目中为什么会出现这种代码。正确的做法是在throw之前,进行数据库连接的关闭,这个做法在DbHelperMySQL.cs中也存在,但不统一,即有的是按这种标准,有的不是。

 

       我再列举一个平时可能会忽视的一个错误写法:这种错误和上面的处理方式应该是一样的,当while循环发生错误时,如果不在抛出异常前关闭dr,此数据库连接就不会即时释放。

      

   using  (MySqlDataReader dr  =  DbHelperMySQL.ExecuteReader(strSql.ToString(),  null ))
            {
                
try
                {
                    
while  (dr.Read())
                    {
                        
// ...

                    }
                    dr.Close();
                }
                
catch  (Exception ex)
                {
                    
throw  ex;
                }

            }

 

    
        思考:上面在throw前不手动关闭数据库连接,是不是受到了using的影响,认为用了using就肯定关闭连接,但在throw后,实际上程序就不会进入finall块,也就不会关闭连接了。
           
        总结:针对数据库的连接一定要仔细对待,在thorw之前保证有效关闭数据库连接,针对Codematic中的问题,如果说的不对的地方,望指正。

转载于:https://www.cnblogs.com/ASPNET2008/archive/2011/04/01/2002005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动软.Net代码生成器Codematic 是一款为C#程序员设计的自动代码生成器,Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。采用 Model+DAL +BLL+Web 的设计,包括生成属性、添加、修改、删除、查询、存在性、Model类构造等基础代码片断,支持不同3种架构代码生成,使程序员可以节省大量机械录入的时 间和重复劳动,而将精力集中于核心业务逻辑的开发。 Codematic 同时提供方便的多类型数据库管理,查询分析器,SQL脚本生成,存储过程生成,数据库文档生成,Web项目发布,代码批量自动输出等多项开发工作中常用到的功能,您可以很方便轻松地进行项目开发。 详细功能说明 1.自动生成代码 可以生成3种不同架构的代码,支持自动创建三层架构项目并生成代码。 它可以生成:实体Model,DAL(数据访问层),IDAL(接口层),DALFactory(类工厂),BLL(业务逻辑层),WEB层等多层的代 码,可以节省大量的时间来做业务逻辑的代码,那些重复的代码就交给它去做吧,1分钟生成一个架构所有的基本代码。我感觉有了它开发项目的效率简直轻松多 了。 2. 多类型数据库集中管理器 类似SQLServer2005的管理界面,支持SQL Server,Oracle,OleDb三种类型的数据库,方便平常在代码编辑的时候想查看数据库的信息,并且可以很直观的查看字段类型,长度,主键,默 认值等详细信息,省去了在代码和数据库管理器之间的来回切换,方便快捷。 3. 查询分析器 。 实现类似于SQLServer的查询分析器的功能,方便编写代码时想进行数查询。 4. 自动生成存储过程和SQL脚本 。可以生成存储过程,查询语句,数据插入脚本,对象定义脚本等。 5. 自动生成数据库结构的文档。 6. Web项目文件发布。 7. 代码批量生成自动导出功能。 8. 其他 : C#ToVB.NET代码转换器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值