回到这个bug,我今天回头从mysql.data的源码里面找原因,看到几个可疑的地方
mysqlcommand的ExecuteScalar方法内部调用的还是mysqlreader这个对象,可以先排除语句本身的错误,因为确实没错,而且确实应该返回而且大部分时间返回正确的值,那么剩下的代码里面可以看到
public override object ExecuteScalar()
{
lastInsertedId = -1;
object val = null;
MySqlDataReader reader = ExecuteReader();
if (reader == null) return null;
try
{
if (reader.Read())
val = reader.GetValue(0);
}
finally
{
if (reader != null)
{
reader.Close();
lastInsertedId = reader.InsertedId;
}
reader = null;
}
return val;
}
reader等于null,或者reader返回的结果为null会导致这个问题,那
1、reader为null,构建reader失败可能就是原因
在看reader返回结果是null又会存在什么可能?
ExecuteReader()里面的代码
catch (MySqlException ex)
{
// if we caught an exception because of a cancel, then just return null
if (ex.Number == 1317)
{
if (TimedOut)
throw new MySqlException(Resources.Timeout);
return null;
}
if (ex.IsFatal)
Connection.Close();
if (ex.Number == 0)
throw new MySqlException(Resources.FatalErrorDuringExecute, ex);
throw;
}
这段catch里面有个值得注意的地方,
2、错误代码1317,
Error: 1317
SQLSTATE: 70100
(ER_QUERY_INTERRUPTED
)
Message: Query execution was interrupted
官方的解释是代码执行被中断,这个也是个可能的地方
总结,这次放假归来,我一定要查出这个bug的原因,而且我也发现大家对mysql.data不了解,这次debug输出出来的东西为什么要用cmd.ExecuteScalar这个方法,而不是直接用mysqlreader,这样才能看出问题的原因,工作在.net上,已经很多东西都看不到了,如果看过源码,一定知道要打印的是mysqlreader里面的东西,我们都还是低水平的debug。没见到高明的人是怎么做的。不要自我满足,你我都是井底之蛙。我们这没有牛人。