我的记录集关闭后是否必须处理SqlCommand?

时间:2013-10-31 03:25:12

标签: c# asp.net dispose sqlcommand

好的,这是微不足道的,但它一直困扰着我。我有类似这样的代码

oCmd = new SqlCommand("getBooking", oCon); 
oCmd.CommandType = CommandType.StoredProcedure;
oRs = oCmd.ExecuteReader();
do while (oRs.Read()) {
    // do stuff
}
oRs.Close();
oCmd.Dispose();

但我可以将Dispose移到ExecuteReader之后:

oCmd = new SqlCommand("getBooking", oCon); 
oCmd.CommandType = CommandType.StoredProcedure;
oRs = oCmd.ExecuteReader();
oCmd.Dispose();
do while (oRs.Read()) {
    // do stuff
}
oRs.Close();

我已经尝试过,它有效,但感觉就像我在调皮。这种方法有问题吗?我问,因为经常需要在SqlCommand中重用do while对象,不,我不想创建多个SqlCommand对象。

3 个答案:

答案 0 :(得分:5)

是的,最好在完成后立即丢弃这些物品。重用命令确实没有优势,因此您的代码可能会变得复杂,难以理解和维护。

最好使用using语法:

using (var oCmd = new SqlCommand("getBooking", oCon))
{
    oCmd.CommandType = CommandType.StoredProcedure;
    using (var oRs = oCmd.ExecuteReader())
    {        
        while (oRs.Read()) {
            // do stuff
        }
    }
}

在一次性对象上使用using(实施IDisposable)时,Dispose方法将调用Close。您可以对SqlConnection执行相同操作。

答案 1 :(得分:1)

虽然它在这种情况下确实有效,但在完成您要求的阅读器之前,您可能不应该将其丢弃。

虽然在这种情况下你知道SqlReader的实现没有使用创建它的SqlCommand对象,但并不适用于所有情况。最好不要对类的实现做出假设。

在这种情况下,我还建议您使用using或try / finally语句,因为如果在代码中的任何地方抛出异常,因为它当前已编写,则不会丢弃sql对象。

答案 2 :(得分:0)

无论何时使用“using block”,都不需要connection.close或connection.dispose。根据CA2202,我们不应多次处置对象