A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 醒梦 中级黑马   /  2013-12-20 12:28  /  1386 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Null在数据库
Null在数据库中表示”不知道”
Select 1+0  运行结果是1
Select 1+Null 运行结果是Null
DBNull
在正规项目中对于Null处理是非常严谨的!!!如果用户没有输入,则数据库中以Null显示,表示“不知道”,如果数据空中Null,则在项目中转换为DBNull,再显示
1.录入过程DBNull
private void bt_OK_Click(object sender, RoutedEventArgs e)
        {
            //数据库中的Null表示“不知道”
            //需求:姓名不输,数据库中为Null;年龄不输,数据库中为Null
            //可是如下代码不能满足需求需要改进
  //用户姓名不输入,年龄32
  //数据库中   32
            //string name = this.txt_UserName.Text.Trim();
            //string age = this.txt_UserAge.Text.Trim();
            //SqlHelper.ExecuteNonQuery(@"insert into T_UserInfo(UserName,UserAge) values(@username,@userage)",
            //new SqlParameter("@username",name),
            //new SqlParameter("@userage",age));
            ////虽然这里数据库会把String类型转换成Int类型,但是增加了数据库运行的负担,所以还是需要代码转换(前提是确保年龄框输入值,如果不输入值,则会报错的!)
            //MessageBox.Show("成功录入!");


            //下面这种,VS中的null不能转换为数据库中的Null不知道,
            //用户名输入admin,年龄输入框不输入值
            //数据库中会插入admin 0
            //string name = this.txt_UserName.Text.Trim();
            //string age = this.txt_UserAge.Text.Trim();
            //if (name.Length <= 0)
            //{
            //    name = null;
            //}
            //if (age.Length <= 0)
            //{
            //    age = null;
            //}
            //SqlHelper.ExecuteNonQuery(@"insert into T_UserInfo(UserName,UserAge) values(@username,@userage)",
            //new SqlParameter("@username", name),
            //new SqlParameter("@userage", Convert.ToInt32(age)));
            ////虽然这里数据库会把String类型转换成Int类型,但是增加了数据库运行的负担,所以还是需要代码转换
            //MessageBox.Show("成功录入!");


            //引入DbNull来解决这个问题
            string name = this.txt_UserName.Text.Trim();
            string age = this.txt_UserAge.Text.Trim();
            //if (name.Length <= 0)
            //{
            //    name = DBNull.Value;//这里DBNull为一个Class类,无法实现与String的类型转换;
            //    //但是:.Net中的所有的类都继承Object,Object可以有String进行类型转换
            //}
            //if (age.Length <= 0)
            //{
            //    age = null;
            //}
            object objname;
            object objage;
            if (name.Length <= 0)
            {
                objname = DBNull.Value;
            }
            else
            {
                objname = name;
            }
            if (age.Length <= 0)
            {
                objage = DBNull.Value;
            }
            else
            {
                objage = age;
            }
            SqlHelper.ExecuteNonQuery(@"insert into T_UserInfo(UserName,UserAge) values(@username,@userage)",
            new SqlParameter("@username", objname),
            new SqlParameter("@userage",objage));
            //虽然这里数据库会把String类型转换成Int类型,但是增加了数据库运行的负担,所以还是需要代码转换
            MessageBox.Show("成功录入!");
        }
显示过程DBNull
private void button1_Click(object sender, RoutedEventArgs e)
        {
            DataTable dt = SqlHelper.ExecuteDataTable("select * from T_UserInfo where Id =16");
            //数据库中Id=15的这一行中姓名为Null ,年龄为32
            //按照下面这种做法是不能够对的,因为数据库中存放的Null是不知道,需要VS与数据库进行比较
            //DBNull(VS) 与Null(数据库)
            //string name = dt.Rows[0]["UserName"].ToString();
            //int age = (int)dt.Rows[0]["UserAge"];
            //this.txt_UserName.Text = name;
            //this.txt_UserAge.Text = age.ToString();

            string name;
            if (dt.Rows[0]["UserName"] == DBNull.Value)
            {
                name = null;
            }
            else
            {
                name=(string)dt.Rows[0]["UserName"];
            }
            int? age;//int 类型和string 类型是不同的
            //int 不能为空,string 可以为空,但是int ?可以为空
            if (dt.Rows[0]["UserAge"] == DBNull.Value)
            {
                age = null;
            }
            else
            {
                age = (int)dt.Rows[0]["UserAge"];
            }
            this.txt_UserName.Text = name;
            this.txt_UserAge.Text = age.ToString();
        }

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

2 个回复

倒序浏览
笔记整理的很好,不过啊,笔记最好不要发到这里,资源分享是些大家一致认可的比较不错的资源,比如说大家都能犯的错误啊,比较不错的学习资料啊,都可以,
回复 使用道具 举报
V_John 发表于 2013-12-20 21:01
笔记整理的很好,不过啊,笔记最好不要发到这里,资源分享是些大家一致认可的比较不错的资源,比如说大家都 ...

恩,第一次分享资源,不是很懂,不好意思啊,下次我会分享大家都会犯的错误,也用于提高自己,谢谢提醒。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马