好的,这很琐碎,但它一直困扰着我。我有这样的代码
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
对象。 最佳答案
尽管在这种情况下它确实可以工作,但您可能不应该处理它,直到您完成从它那里请求的阅读器的处理为止。
尽管在这种情况下,您知道SqlReader的实现未使用创建它的SqlCommand对象,但并非在所有情况下都适用。最好不要对类的实现进行假设。
在这种情况下,我还建议您使用using或try / finally语句,因为如果在当前编写的代码中的任何地方抛出异常,则不会处理sql对象。
关于c# - 关闭记录集后,是否需要处置SqlCommand?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19697935/