MySqlDataReader c#中的HasRows属性总是返回真值
本文关键字:返回 属性 中的 HasRows MySqlDataReader | 更新日期: 2023-09-27 17:50:06
在我的代码中,当我使用Visual Studio c#调试时,我注意到,虽然查询中没有行:
select MAX(idSalesJournal) as maxId from accountingsystemdb.salesjournal"
dr.HasRows属性总是返回TRUE。当我继续调试时,我注意到循环将在退出循环之前运行1次。现在我有一个大问题,因为尽管数据集中没有数据,循环如何运行1次。然后,我在消息框中打印了我得到的值,它没有显示任何内容(空白)。这是怎么发生的,我怎样才能避免呢?我将放置我在mySql工作台中执行的相同查询的图像,该查询成功执行并且没有在结果中显示任何行。它在MySql中显示0行。在c#中执行的相同查询将返回Hasrows属性为True。我把我的完整代码放在下面。
public void salesJournal(string addOrRemove, string lorryNo, string invoiceNo, DateTime billDate, string source, DateTime paybackDate, string itemCode, double itemcost, string desc, double qty, double discount, double amount, string debtor)
{
if (conn.State.ToString() == "Open")
{
conn.Close();
conn.Open();
}
int maxID = 0;
if (conn.State.ToString() == "Closed")
{
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
//---------------------- Selecting Max ID ------------------------------------------
cmd.CommandText = "select MAX(idSalesJournal) as maxId from accountingsystemdb.salesjournal";
try
{
MySqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows && dr != null)
{
while (dr.Read())
{
maxID = Convert.ToInt32(dr["maxId"].ToString());
}
}
else
{
maxID = 0;
}
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
conn.Close();
//---------------------------------------------------------------------------------
if (conn.State.ToString() == "Open")
{
conn.Close();
conn.Open();
}
else
{
conn.Open();
}
try
{
cmd.CommandText = "insert into accountingsystemdb.salesjournal VALUES('" + maxID + 1 + "', STR_TO_DATE('" + billDate + "', '%m/%d/%Y %h:%i:%s %p'), '" + invoiceNo + "', '" + lorryNo + "', '" + source + "', '" + itemCode + "', '" + desc + "', '" + qty + "', '" + itemcost + "', '" + amount + "', '" + discount + "', '" + addOrRemove + "', STR_TO_DATE('" + paybackDate + "', '%m/%d/%Y %h:%i:%s %p'), '" + debtor + "', '" + Program.username + "')";
cmd.ExecuteNonQuery();
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
conn.Close();
}
}
你用错工具了。DataReader
应该用于迭代数据集,并且您只期望返回一个值(或null)。
正确的使用方法是MySqlCommand.ExecuteScalar
try
{
var result = cmd.ExecuteScalar();
if (result != null)
{
maxID = Convert.ToInt32(result);
}
else
{
maxID = 0;
}
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
用ExecuteScalar
代替ExecuteReader
试试这个
object countObj = cmd.ExecuteScalar();
int maxCount = 0;
if (countObj != null)
{
int.TryParse(countObj.ToString(), out maxCount);
}
是。这是因为,如果没有存在的单元格值将在SQL SERVER为空。因此,文本"NULL"
是在SQLServer中返回的结果。
最好使用dr.read()
来检查reader HasRows
if(dr.read())
{
// code logic for HasRows
}
else
{
// if nothing is there
}
对MySql数据库的查询可以返回两个结果集。第一个结果集(又名表)是返回/影响的行数,第二个是实际查询的结果。
所以HasRows被设置为true是准确的,因为您正在读取第一个结果集,其中有1行包含从实际查询返回的行数。
调用dr.NextResult()获取实际查询结果