如果我正在调用 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.HasRows
比Read()
更能说明它的作用,所以它会是一个 良好做法使用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的主要内容,如果未能解决你的问题,请参考以下文章