测试准备:
1.新建一个表
CREATE TABLE `cacb` (
`CA` varchar(255) DEFAULT NULL,
`CB` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.新建一个控制台项目,主函数实现如下:
#region Mysql DBNull测试
string con = "server=localhost;User Id=root;database=mytest;password=my88888;persist security info=True;charset=utf8;";
bool flg = null is object;//false
bool fdb = DBNull.Value is object;//true
string sql = "SELECT * from CACB limit 1,1;";
using (MySqlConnection mc=new MySqlConnection(con))
{
mc.Open();
using (MySqlCommand com=new MySqlCommand(sql,mc))
{
var result= com.ExecuteScalar();
if (result==DBNull.Value)
{
Console.WriteLine("这个确定是数据库空的了");
}
if (result==null)
{
Console.WriteLine("这里是null了.");
}
}
}
#endregion
3.结论:DBNull是针对那些查询出来的值为Null的数据,继承Object,null是.net里面的一种类型数据不继承Object,说白了就是,DBNull是数据库的默认空值,而null是.net的默认值空值。那么row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。
需要引起注意的是: ExecuteScalar的规则是,返回第一列,第一行的数据。假如有第一行,但是第一列为空,那么返回的是DBNull 。假如一行都没有,那么ExecuteScalar就返回null,假如第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。
所以我们在查询数据的结果的时候要注意直接用 dbresult==null 作为条件判断是容易出问题的。
可以参考下前辈们的探索:
- http://blog.csdn.net/cmalaya/article/details/7222621
- http://www.cnblogs.com/chen-fan/articles/2171399.html
版权声明:本文为CSDN博主「weixin_33810302」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_33810302/article/details/91965762