好的,这很琐碎,但它一直困扰着我。我有这样的代码

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/

10-09 09:11