C# 如果我调用SqlReader.Read,是否应该调用SqlDataReader.HasRows
尝试查看在C# 如果我调用SqlReader.Read,是否应该调用SqlDataReader.HasRows,c#,sql,.net,methods,sqldatareader,C#,Sql,.net,Methods,Sqldatareader,尝试查看在while(dr.read())函数之前添加if(dr.HasRows)是否有益。我的意思是,从技术上讲,如果它没有行,它就不会被读取,那么,如果你先检查一下,这有什么关系吗 using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.HasRows) { while (dr.Read()) { ....do stuff here } }
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
}
}
我认为这主要适用于可能有数据也可能没有数据(一个或多个结果集)的存储过程,如果您还执行while循环以外的其他操作(即有数据时初始化页眉/页脚等),那么首先检查“更容易”(dr.HasRows),这不是必须的。如果有更多的数据要读取,Read()方法将返回true;如果没有更多的数据,则返回false,从而中断while循环。no
Read()
将返回False如果没有更多的行可获取,但是Reader.HasRows
比Read()
更能说明它的功能,因此使用Reader.HasRows
是一种好的做法,因为您可能会意外地执行Read()以外的操作
可能会出现异常。试试看
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;
}
}
你的意见需要小心。HasRows()对于我的CTE查询返回false,即使有行(实际上是437行)。如果if上有else子句,这将是有益的。如果没有行,是否需要特殊处理?请小心HasRows,因为当Read()返回SqlException时,它可能会返回false,例如,因为您的SQL中存在错误或在Insert上违反了数据约束等。通常,您需要知道是否真的没有行或存在错误。@IvanAkcheurov是正确的。除了他的例子之外,仅仅使用HasRows不会知道被选为死锁受害者-直到调用Read()时才会抛出SqlException。这两条注释最终会改变应该是“良好实践”的内容,即不要将
Read()
与HasRows()
短路。出于这个原因,我投票否决了答案。@JohanBoulé哪种做法对你来说是好的?示例代码?@PreguntonCojoneroCabrón Ivan Akheurov的评论就是答案:不要为HasRows操心。问题的原始海报提供了一个直接调用Read()的示例代码,我认为这是更好的做法。我还再次意识到ADO.NET API的设计有些不好。在第一次使用的站点声明变量,并请使用和语句。被否决。