【问题标题】:HasRows property in MySqlDataReader C# always return true value?MySqlDataReader C# 中的 HasRows 属性总是返回真值?
【发布时间】:2015-08-01 15:48:54
【问题描述】:

在我使用 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();

        }


    }

【问题讨论】:

  • 即使会有0,在我看来MAX 确实会返回一个值。您的命令在数据库管理器中返回什么?正如您所说,您的while 循环了 1 次,这意味着您一行实际上,这太正常了HasRows 返回true

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


【解决方案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());
}

【讨论】:

  • 我猜ExecuteScalar 在返回单个值时使用。检查reference。)
【解决方案2】:

不要使用ExecuteReader,而是使用ExecuteScalar

试试这个

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

【讨论】:

  • 这个问题怎么回答? o.O
【解决方案3】:

是的。这是因为,如果没有任何内容,则 SQL SERVER 中的单元格值将为空。所以文本 "NULL" 是 SQLServer 中返回的结果。

最好使用dr.read()检查阅读器是否HasRows

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多