1

我现在在网上搜索了一段时间。但是没有找到任何明确的答案来回答我的问题。在连接到数据库时我应该使用“使用”还是可以只使用 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,只是想知道这类问题的最佳答案是什么。

4

3 回答 3

3

它没有任何区别 - 无论你喜欢什么。无论如何,该子句都会被编译器using变成 a 。try-finally

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

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

于 2012-07-05T05:12:04.287 回答
2

参考:使用语句 C#。

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

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

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

参考:示例

根据代码项目,.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();    
  } 
} 
于 2012-07-05T05:31:55.690 回答
0

调用Dispose相当于Close在大多数(如果不是全部)DbConnection实现中调用,因此如果您已经调用后者,则无需调用前者。只要确保你这样做finally,以防万一有例外。

于 2012-07-05T05:44:50.780 回答