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

JJB*_*ter 1 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();
Run Code Online (Sandbox Code Playgroud)

但是我Dispose可以在ExecuteReader这之后移动到:

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

我试过了,它有效,但感觉就像我在调皮.这种方法有问题吗?我问,因为经常需要重新使用其中的SqlCommand对象do while,而不是我不想创建多个SqlCommand对象.

Szy*_*mon 5

是的,最好在你完成它们后立即处理它们.重用命令确实没有优势,因此您的代码可能会变得复杂,难以理解和维护.

最好使用它的using语法:

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

当您使用using一次性对象(实现IDisposable)时,Dispose方法将调用Close.你可以为你做同样的事情SqlConnection.