不一样的 Null
2024-09-05 03:22:44
前不久处理一个异常的时候发现了一段有趣的代码,一同事在往表里(Sql Server 数据库)添加数据的时候给可以为 null 的字段赋了如下的值:
Student stu = new Student();
stu.Name = "晓菜鸟";
stu.Age = ;
stu.RegTime = (DateTime)System.Data.SqlTypes.SqlDateTime.Null;
stu.Remark = (string)System.Data.SqlTypes.SqlString.Null;
stuService.Add(stu);
问题出现在读取数据上,读取的时候判断 Remark != null 竟然成立,然后读取数据就报错了。:(
后来我查看数据库记录,发现存储的 Null 和数据库默认的 Null 不一样,在 C# 里面进行比较,得到的结果也证明他们是不一样的 Null 。
总结:我个人觉得根本就不用这么做,假如数据库中 nvarchar 或者 varchar 类型的字段设置了可以为 null,就没必要主动赋 null 值给他,默认的就是null,而对于 DateTime 类型来说,就算你没有在数据库中显示的设置默认值,你插入一个空值进去他保存的也是系统默认时间(1900-01-01)。
注意:对于 DateTime 类型,插入空值和 Null,结果是不一样的。
//数据库 test 表结构
//Name nvarchar(50) 可以为 null
//CreateTime datetime 可以为 null string cmdStr = string.Format("insert into [test] VALUES('{0}','{1}')", name, null);//操作结果:默认值 1900-01-01.
string cmdStr = string.Format("insert into [test] VALUES('{0}',null)", name);//操作结果:NULL .
string cmdStr = string.Format("insert into [test] VALUES('{0}','')", name);//操作结果:默认值 1900-01-01.
:)
最新文章
- MySQL知识树-支持的数据类型
- 2015.05.12:json的常用处理方式
- nginx的upstream目前支持5种方式的分配(转)
- apache使用ssl数字证书
- oracle--number
- 获得android应用的版本号
- VC获取精确时间的做法
- netsh命令之ip设置
- Vuex 模块化与项目实例 (2.0)
- [1] Entity Framework
- UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库
- 《Node.js 高级编程》简介与第二章笔记
- Consul vs. Zookeeper
- Alpha预乘-混合与不混合[转]
- AOP编程报错Xlint:invalidAbsoluteTypeName
- hdu 1828 Picture 切割线求周长
- SqlServer触发器实现表的级联插入、级联更新
- 成员函数的const究竟修饰的是谁
- sed你所不知道的语法
- Oracle replace()函数