【问题标题】:Do I have to Dispose a SqlCommand after its recordset is closed?关闭记录集后是否必须处理 SqlCommand?
【发布时间】:2013-11-10 22:51:16
【问题描述】:

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

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();

我试过了,它有效,但感觉我很顽皮。这种方法有问题吗?我问是因为经常需要在do while 中重复使用SqlCommand 对象,而且我不想创建多个SqlCommand 对象。

【问题讨论】:

  • 如果您打算在循环中再次使用SqlCommand,请不要在循环之前处理它,也许使用using 语句会使一切变得更清晰

标签: c# asp.net dispose sqlcommand


【解决方案1】:

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

最好使用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 执行相同的操作。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      只要你使用“使用块”,就不需要 connection.close 或 connection.dispose。根据 CA2202,我们不应多次处理对象

      【讨论】:

        猜你喜欢
        • 2010-11-14
        • 1970-01-01
        • 2013-03-20
        • 2020-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        相关资源
        最近更新 更多