好的,这是微不足道的,但它一直困扰着我。我有类似这样的代码
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
对象。
答案 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,我们不应多次处置对象