1

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

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

但是我可以像这样移动DisposeExecuteReader

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对象。

4

3 回答 3

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.

于 2013-10-31T03:27:42.763 回答
1

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

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

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

于 2013-10-31T04:02:09.263 回答
0

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

于 2013-10-31T06:05:39.457 回答