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();
        }

    }

MySqlDataReader c#中的HasRows属性总是返回真值

你用错工具了。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()获取实际查询结果