c#中处理数据库中字段值的Null问题

来源:互联网 发布:网狐棋牌游戏源码 编辑:程序博客网 时间:2024/05/16 09:13

当数据表的字段值允许为空时,若在插入数据时没提供数值,则值就会默认是Null,这个Null和空字符串('')以及0都不同,Null表示“不知道”。

例如:select 1+0的结果是1,而select 1+Null的结果是Null;

           select 'aa'+''的结果是'aa',而select 'aa'+Null的结果是Null;

C#中直接往数据库中插入Null是不行的,参数化查询时如果参数的值是Null,会提示未提供参数。C#提供了一个DBNull类,使用DBNull.Value来代替Null可以解决这个问题。

写的源代码如下:

//数据表test中的name、age字段设置了允许为空

object name, age;
            if (txtName.Text.Length <= 0)// 判断是否有输入姓名
            {
                name = DBNull.Value;//DBNull表示不存在的值
            }
            else
            {
                name = txtName.Text;
            }
            if (txtAge.Text.Length <= 0)//判断是否有输入年龄
            {
                age = DBNull.Value;
                //age = null; //将null直接赋值给age,执行SQL语句时会报错,提示未提供参数
            }
            else
            {
                age = txtAge.Text;
            }
            int height = Convert.ToInt32(txtHeight.Text);
            string connStr = @"Data Source=.\SQLExpress;Initial Catalog=practice;User ID=sa;Password=381213";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "insert into test(name,age,height)values(@Name,@Age,@Height)";
                    cmd.Parameters.Add(new SqlParameter("@Name",name));
                    cmd.Parameters.Add(new SqlParameter("@Age", age));
                    cmd.Parameters.Add(new SqlParameter("@Height", height));
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("插入成功");
                }
            }

反过来,从数据库中将Null值读取出来,也是使用DBNull.Value来判断。

 string connStr = @"Data Source=.\SQLExpress;Initial Catalog=practice;User ID=sa;Password=381213";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from test";
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataSet dataset = new DataSet();
                    adapter.Fill(dataset);
                    DataTable table = dataset.Tables[0];
                    DataRow row = table.Rows[0];
                    string name;
                    int? age,height;
                    if (row["name"] == DBNull.Value)
                    {
                        name = null;
                    }
                    else
                    {
                        name = (string)row["name"];
                    }
                    if (row["age"] == DBNull.Value)
                    {
                        age = null;
                    }
                    else
                    {
                        age = (int)row["age"];
                    }
                    height = (int)row["height"];
                    MessageBox.Show("读取成功,姓名:"+name+",年龄:"+age+",身高:"+height);
                }
            }