MySqlDataReader C#中的HasRows属性总是返回true值吗?

时间:2015-05-20 11:56:00

标签: c# mysql visual-studio-2012 mysql-workbench mysqldatareader

在我使用Visual Studio C#调试时的代码中,我注意到虽然查询中没有行:

select MAX(idSalesJournal) as maxId from accountingsystemdb.salesjournal" 

dr.HasRows属性始终返回TRUE。当我继续调试时,我注意到循环将在退出循环之前运行一次。现在我遇到了一个很大的问题,因为虽然数据集中没有数据,但循环如何运行一次。然后我在消息框中打印了我得到的值,它没有显示任何内容(空白)。怎么会发生这种情况,我怎么能避免这件事呢?我将把我在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();

        }


    }

4 个答案:

答案 0 :(得分:1)

您使用的工具不正确。 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());
}

答案 1 :(得分:0)

而不是使用ExecuteReader使用ExecuteScalar

试试这个

object countObj = cmd.ExecuteScalar();
int maxCount = 0;
if (countObj != null)
{
    int.TryParse(countObj.ToString(), out maxCount);
}

答案 2 :(得分:0)

是。这是因为,如果没有,那么 SQL SERVER 中的单元格值将为null。所以文本"NULL"是SQLServer中返回的结果。

最好使用dr.read()来检查读者是否 HasRows

if(dr.read())  
{
 // code logic for HasRows
}
else
{
// if nothing is there
}

答案 3 :(得分:0)

对MySql数据库的查询可以返回两个结果集。第一个结果集(aka表)是返回/影响的行数,第二个是实际查询的结果。

因此,将HasRows设置为true是准确的,因为您正在读取第一个结果集,其中包含1行,其中包含从实际查询返回的行数。

调用dr.NextResult()以获取实际的查询结果。