如果我调用SqlReader.Read,应该调用SqlDataReader.HasRows

Jos*_*rix 22 .net c# sql methods sqldatareader

试着看看if (dr.HasRows)while (dr.read())函数之前添加一个是否有益.我的意思是,从技术上讲,如果它没有行,它就不会读取,所以如果你先检查它会有关系吗?

using (SqlDataReader dr = cmd.ExecuteReader())
{
    if (dr.HasRows)
    {
        while (dr.Read())
        {
            ....do stuff here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你只是确保它有值提供,那么这基本上会做同样的事情......

using (SqlDataReader dr = cmd.ExecuteReader())
{
    while (dr.Read())
    {
        ....do stuff here
    }
}    
Run Code Online (Sandbox Code Playgroud)

Vis*_*har 16

否..不必检查(dr.HasRows)DataReader是否包含任何行.

Read()如果没有更多的行要提取,它将返回False,但是Reader.HasRows它更能说明它的作用,Read()因此这是一个很好的做法,Reader.HasRows因为你可能会意外地做一些Read()可能属于异常的事情.

  • 小心使用HasRows,因为当Read()**返回SqlException时它可能返回false,例如因为你的SQL中存在错误或插入时存在数据约束的违规等.通常你需要知道是否有真的只是没有行或有错误. (11认同)
  • @IvanAkcheurov是对的.除了他的示例之外,仅使用HasRows将无法识别被选为死锁的受害者 - 在调用Read()之前不会抛出SqlException. (2认同)
  • 这两个评论最终改变了应该成为“良好习惯”的东西,即不要将“ Read()”与“ HasRows()”短路。因此,我投票否决了答案。 (2认同)

Cha*_*lky 5

小心.HasRows()为我的CTE查询返回false,即使有行(实际上是437行).