【问题标题】:Should I call SqlDataReader.HasRows if I am calling SqlReader.Read如果我正在调用 SqlReader.Read,我应该调用 SqlDataReader.HasRows
【发布时间】:2012-12-21 05:21:32
【问题描述】:

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

using (SqlDataReader dr = cmd.ExecuteReader())
{
    if (dr.HasRows)
    {
        while (dr.Read())
        {
            ....do stuff here
        }
    }
}

或者,如果您只是确保它具有要提供的价值,这是否会在本质上做同样的事情......

using (SqlDataReader dr = cmd.ExecuteReader())
{
    while (dr.Read())
    {
        ....do stuff here
    }
}    

【问题讨论】:

  • 如果在 if 上有一个 else 子句,那将是有益的。如果没有行,是否需要特殊处理?

标签: c# sql .net methods sqldatareader


【解决方案1】:

没有。如果DataReader包含任何行,则不必检查(dr.HasRows)

Read() 将返回 False 如果没有更多的行要获取,但Reader.HasRowsRead() 更能说明它的作用,所以它会是一个 良好做法使用Reader.HasRows,因为您可能会不小心执行Read() 以外的其他操作,这可能会导致异常。

【讨论】:

  • 小心 HasRows 因为它可能会在 Read() 会返回 SqlException 时返回 false,例如因为你的SQL有错误或者违反了Insert的数据约束等等。通常你需要知道是真的没有行还是有错误。
  • @IvanAkcheurov 是正确的。除了他的示例之外,仅使用 HasRows 不会知道被选为死锁受害者 - 在调用 Read() 之前不会抛出 SqlException。
  • 这两个 cmets 最终会改变应该是“良好做法”的东西,即不要将 Read()HasRows() 短路。出于这个原因,我对答案投了反对票。
  • @JohanBoulé 哪个是你的好习惯?示例代码?
  • @PreguntonCojoneroCabrón Ivan Akcheurov 的评论就是答案:不要打扰 HasRows。该问题的原始海报提供了一个直接调用 Read() 的示例代码,我认为这是更好的做法。我也再次意识到 ADO.NET API 到处都有一些糟糕的设计。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    检查 DataReader 是否有行 (dr.HasRows) 不是强制性的。如果有更多数据要读取,Read() 方法将返回 true,如果没有更多数据,则返回 false,从而中断 while 循环。

    【讨论】:

      【解决方案4】:

      我认为这主要是针对可能有数据也可能没有数据(一个或多个结果集)的存储过程,如果您还执行除了 while 循环之外的其他事情(即初始化标头/页脚等有数据时)。

      【讨论】:

        【解决方案5】:

        试试

                    string myconnection = "datasource= localhost;port=3306;username=root;password=root;";
                    MySqlConnection myconn = new MySqlConnection(myconnection);
        
                    //MySqlDataAdapter mydata = new MySqlDataAdapter();
                    MySqlDataReader myreader;
        
                    MySqlCommand SelectCommand = new MySqlCommand("select *from student_info.student_info where username= '" + textBox1.Text +" 'and password=' " + textBox2.Text +"';",myconn );
        
        
                    myconn.Open();
        
                    myreader = SelectCommand.ExecuteReader();
                    int count = 0;
                    if (myreader.HasRows) //returing false but i have 4 row
                    {
                        while (myreader.Read()) //returing false 
                        {
                            MessageBox.Show("in button3");
                            count = count + 1;
                        }
                    }
        

        需要您的意见

        【讨论】:

        • 在第一次使用的地方声明变量,请使用using声明。投反对票。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        相关资源
        最近更新 更多