1

在我的代码中,当我使用 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();

        }


    }
4

4 回答 4

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());
}
于 2015-05-20T12:06:00.767 回答
0

而不是使用ExecuteReader使用ExecuteScalar

尝试这个

object countObj = cmd.ExecuteScalar();
int maxCount = 0;
if (countObj != null)
{
    int.TryParse(countObj.ToString(), out maxCount);
}
于 2015-05-20T12:04:47.680 回答
0

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

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

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

于 2015-05-20T12:12:06.350 回答
0

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

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

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

于 2015-05-20T12:24:59.427 回答