【问题标题】:C# SqlDataReader close methodC# SqlDataReader 关闭方法
【发布时间】:2011-09-04 15:58:20
【问题描述】:

以下哪种方法更适合关闭SqlDataReader

 SqlDataReader reader = comm.ExecuteReader();

 while (reader.Read())
 {
 }
 reader.Close();
 reader.Dispose();

SqlDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
}

或者还有其他更进一步的关闭方法?

【问题讨论】:

    标签: c# dao sqldatareader sqlcommand


    【解决方案1】:

    正确的处理方式是using 语句:

    using(SqlDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection)) {
        while (reader.Read())
        { 
    
        }
    }
    

    这样对象就可以正确处理(并且您无需调用Close())。

    【讨论】:

      【解决方案2】:

      根据我的经验,using 声明是在这种情况下的最佳实践。即使内部某处发生异常,它也可以确保正确关闭连接。

      using (SqlDataReader reader = comm.ExecuteReader())
      {
          while (reader.Read())
          {
              //Do stuff...
          }
      }
      

      当然,您可以对try { } finally { } 执行相同的操作,这就是using 语句在内部执行的操作。我发现养成始终通过using 语句处理读者的习惯通常是一个好主意,以避免泄漏连接的可能性。

      【讨论】:

        【解决方案3】:

        如果您在一个方法中使用 reader,则使用第一个场景,如果您将 reader 作为返回值(不在一个范围内)传递,则使用第二个场景。

        【讨论】:

          【解决方案4】:

          您需要的文档是这个:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close.aspx

          引用:“当您使用 SqlDataReader 将关联的 SqlConnection 用于任何其他目的时,您必须显式调用 Close 方法。”

          【讨论】: