我正在网上搜索一会儿。但没有找到任何明确的答案我的问题。无论是在连接数据库时我应该使用“使用”还是我可以使用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,只是想知道这类问题的最佳答案是什么。
答案 0 :(得分:3)
它没有任何区别 - 无论你喜欢什么。无论如何,编译器将using
子句变为try-finally
。
编辑我刚注意到,如果发生异常,您只会调用Dispose。你也应该把它移到finally子句中。 Dispose将调用Close,因此如果您不想,则无需专门调用它。
进一步编辑鉴于您说DbConnection是静态的,那么您不想调用Dispose,但您需要调用Close。但是,不应该使用静态DbConnection - 连接池将负责有效地处理连接。您的代码每次都应创建一个新的连接实例。
答案 1 :(得分:2)
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
中执行此操作。