当数据表的字段值允许为空时,若在插入数据时没提供数值,则值就会默认是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);
}
}