当使用“DbConnection”时,我应该使用“using”或try-catch-finally来使用DbConnection.close()来关闭连接吗?

时间:2012-07-05 05:04:42

标签: c# database ado.net using dbconnection

我正在网上搜索一会儿。但没有找到任何明确的答案我的问题。无论是在连接数据库时我应该使用“使用”还是我可以使用try-catch-finally?我的意思是:

我不知道每次完成与数据库的交互还是关闭连接时都应该调用dispose方法。

    static public List<Category> GetAll()
    {
        List<Category> CategoryList;

        try
        {
            BaseDAO.Dbconn.Open();
            BaseDAO.SetCommand(BaseDAO.CommandAction.Read, "SELECT * FROM Categories");

            CategoryList = new List<Category>();

            using (DbDataReader reader = BaseDAO.Dbcmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    int ID = reader.GetInt32(reader.GetOrdinal("CategoryID"));
                    string Name = reader.GetString(reader.GetOrdinal("CategoryName"));
                    string Description = reader.GetString(reader.GetOrdinal("Description"));
                    CategoryList.Add(new Category(ID, Name, Description));
                }
            }
            return CategoryList;
        }
        catch (Exception ex)
        {
            BaseDAO.Dbconn.Dispose();
            throw ex;
        }
        finally { BaseDAO.Dbconn.Close(); }

    }

“Dbconnection”是静态的,不确定这是否也是一个好的解决方案......

我开始了解ADO,只是想知道这类问题的最佳答案是什么。

3 个答案:

答案 0 :(得分:3)

它没有任何区别 - 无论你喜欢什么。无论如何,编译器将using子句变为try-finally

编辑我刚注意到,如果发生异常,您只会调用Dispose。你也应该把它移到finally子句中。 Dispose将调用Close,因此如果您不想,则无需专门调用它。

进一步编辑鉴于您说DbConnection是静态的,那么您不想调用Dispose,但您需要调用Close。但是,不应该使用静态DbConnection - 连接池将负责有效地处理连接。您的代码每次都应创建一个新的连接实例。

答案 1 :(得分:2)

参考:Using Statement C#.

using语句允许程序员指定何时使用资源的对象应该释放它们。

  

提供给using语句的对象必须实现   IDisposable接口。这个接口提供了Dispose方法,   哪个应该释放对象的资源。

当达到using语句的结尾或者抛出异常并且控制在语句结束之前离开语句块时,可以退出using语句。

参考:Example

根据Code Project,.NET CLR转换

 using (MyResource myRes = new MyResource())
 {     
     myRes.DoSomething();
 } 

{ 
   // limits scope of myRes   
   MyResource myRes= new MyResource();    
  try    
  {        
    myRes.DoSomething();  
  }   
  finally   
  {        
     // Check for a null resource.        
     if (myRes!= null)            
     // Call the object's Dispose method.          
      ((IDisposable)myRes).Dispose();    
  } 
} 

答案 2 :(得分:0)

调用Dispose相当于在大多数(如果不是全部)Close实现中调用DbConnection,因此如果您已经调用后者,则无需调用前者。如果出现异常,请确保在finally中执行此操作。