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

Posted

技术标签:

【中文标题】如果我正在调用 SqlReader.Read,我应该调用 SqlDataReader.HasRows【英文标题】:Should I call SqlDataReader.HasRows if I am calling SqlReader.Read 【发布时间】: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 子句,那将是有益的。如果没有行,是否需要特殊处理? 【参考方案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声明。投反对票。

以上是关于如果我正在调用 SqlReader.Read,我应该调用 SqlDataReader.HasRows的主要内容,如果未能解决你的问题,请参考以下文章

我应该处理 WSASend() 可能不会发送所有数据的事实吗?

我应该处理 X509Certificate2 吗?

REST API 的验收测试 - 我应该处理所有情况吗?

我应使用哪个Archimate元素为商店建模

Flutter 队列 API 请求稍后执行

UIDropInteractionDelegate performDrop 没有被调用?