在我使用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();
}
}
答案 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()以获取实际的查询结果。