Null在从数据库读取的时候的一点点小阴谋
2012-02-10 15:55 随风浪迹天涯 阅读(1001) 评论(11) 编辑 收藏 举报
我们先看下面的一段代码,这段代码其实很平常,也是我们平时做项目很常用的一段。它的功能很简单,就是说先在数据库里查找为Name的字段,然后进行判断,如果它的值为空的话,那么number的值就加1.
比如,加黑的就是我们需要注意下的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int number = 0; string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\lando\Desktop\UML Extension\MyPratices\WebServices\App_Data\Database1.mdf;Integrated Security=True;User Instance=True" ; using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); string str = "select * from Test" ; using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = str; SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { string name = dr[ "Name" ].ToString(); DateTime dt = dr.GetDateTime(dr.GetOrdinal( "InputDate" )); <strong> if (dr[ "Name" ] == null ) { number += 1; } </strong> } } } if (number == 0) Label1.Text = "不存在Name为null的值" ; else Label1.Text = "Name为空值的个数为:" + number; |
然后,在看看我数据里的数据:
在我们的Test表里,有3个数据,而第三条数据的Name字段的值为空,刚刚开始,我理所当然的认为在Label里会输出:Name为空值的个数为:1.
很多故事告诉我们,很随意的下结论是很容易错误的。比如说,我现在做的这个结论。
结果很不意外的没有找到Null为Name的值?
咋的啦?我刚开始左右寻思不知道原因在哪里。然后,很习惯的设上断点,然后开始 F5 开始调试。。。
上图:
看到了没有啊?它不认。也就是说 如果在数据库(至少是在SQL里的吧?在oracle我还不知道)的空值 其实不是null,它用表面现象欺骗了你。
不过,我们可以从上面的截图中看到它的类型:object{System.DBNull},我们可以从这里发现一点端倪。
对,从类型里面下手,然后我在网上看了一些DBNull的知识。具体的,看官可以自己在百度下。
知道了是类型的问题,改正过来就很OK了,核心只需要改如下:
if (dr[ "Name" ] == DBNull.Value) { number += 1; } |
就OK了,然后它就能正确的识别。
还有另外一个方法,其实都是差不多,换汤不换药:
if (Convert.IsDBNull(dr[ "Name" ])) { number += 1; } |
也行。。
没骗你吧!
出处:http://www.cnblogs.com/damonlan
Q Q:*********
E_mail:Damon_lan@163.com or Dongcai.lan@hp.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步