在c#中使用using语句处理与数据库相关的类是最佳实践

本文关键字:最佳 数据库 using 处理 语句 | 更新日期: 2023-09-27 18:18:27

using语句自动执行IDisposable中包含的Dispose方法,数据库相关类(如SqlConnection、SqlCommand等)实现该接口。

那么,如果我要使用这种类型的类,我是否应该使用using语句来创建对象,以便在操作结束时释放资源?

例如,由于某种原因,我需要使用SqlConnection, SqlCommand, SqlDataAdapter和DataTable,所以我在下面写了这段代码,这是最好的方法吗?或者我应该把Dispose()放在try的finally子句中…赶上……最后呢?

using (SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectionString))
using (SqlCommand cmd = new SqlCommand())
using (SqlDataAdapter da = new SqlDataAdapter())
using (DataTable dt = new DataTable())
{
    // Do something...
}

在c#中使用using语句处理与数据库相关的类是最佳实践

你的方式是正确的。Dispose()方法将自动调用Close()。对于实现IDisposable的所有东西来说,这并不一定都是正确的,但对于与db相关的类来说,这是正确的。

完成Chris回答:

如果你用try/finally的方式,你必须检查是否所有的实例都不是空的:

try
{
    SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectionString);
    ...
}
finally
{
    if (con != null) con.Dispose();
    if (cmd != null) cmd...
}
using语句正是为了简化这种用例。

顺便说一下,它可以做更多很酷的事情:http://pragmateek.com/c-scope-your-global-state-changes-with-idisposable-and-the-using-statement/

Chris的回答是正确的,但是请注意一些当前的数据库实现实际上并没有在它们的Dispose调用中做太多的事情。

这可能意味着"差"但简单的代码,例如返回DataTable本身,实际上可能与"适当"的代码资源使用没有太大区别。

但是因为这些类已经实现了IDisposable,所以你应该始终使用Using,以防将来它们的实现发生变化来实际处理一些东西。