[SQL]躺着也中枪的datetime类型
写在前面
本来这个东西,我是不想在这里总结的,今天有初学者的朋友问我了,那就不得不说说了,你肯定也踩过这样的坑,没遇到,说明你运气好,编码习惯好。那还是言归正传吧。避免你中枪,还是扫一眼这篇文章吧。
一个例子
测试环境:sqlserver2012,vs2013
下面看一个简单的例子,例子非常简单,就不再写注释了。一个测试的数据表TB_UserInfo:
一个再简单不过的表,自增的id,用户名字,注册时间,从上图你也看到了,是允许为空的。
再弄一个简单的测试程序。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Data;
- using System.Data.SqlClient;
- namespace Wolfy.SQLDateTimeDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- string strConn = "server=.;database=test;uid=sa;pwd=sa;";
- string strSql = "insert into TB_userInfo values(@Name,@RegDateTime)";
- UserInfo user = new UserInfo() { Name = "wolfy" };
- try
- {
- using (SqlConnection conn = new SqlConnection(strConn))
- {
- using (SqlCommand cmd = new SqlCommand(strSql, conn))
- {
- cmd.Parameters.Add(new SqlParameter("@Name", user.Name));
- cmd.Parameters.Add(new SqlParameter("@RegDateTime", user.RegDateTime));
- conn.Open();
- if (cmd.ExecuteNonQuery() > )
- {
- Console.WriteLine("注册成功");
- }
- else
- {
- Console.WriteLine("注册失败");
- }
- }
- }
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- }
- /// <summary>
- /// 用户信息类
- /// </summary>
- class UserInfo
- {
- /// <summary>
- /// 编号
- /// </summary>
- public int Id { set; get; }
- /// <summary>
- /// 姓名
- /// </summary>
- public string Name { set; get; }
- /// <summary>
- /// 注册时间
- /// </summary>
- public DateTime RegDateTime { set; get; }
- }
- }
我们知道,如果在使用类的属性的时候,你不为他赋值,则采用默认值。
可见它是有默认值的。
那我们继续往下走,再看看
出现了,这个异常,想必很多人都遇到过吧。
可以看出,vs中datetime类型的默认值与sqlserver中的datetime类型范围的确存在冲突。突然有这样的想法,为什么这两种默认值不兼容呢?考虑到现在的软件都会和数据库相结合,这样设计是不是有点不合理了?这东西,咱也是无法改变了,也只能选择接收了。尽量做到规范设计吧。
有两种做法可以解决这个问题:
方案一:
在添加数据的时候,为datetime类型的值赋值为当前时间。
- UserInfo user = new UserInfo() { Name = "wolfy", RegDateTime=DateTime.Now };
方案二:
创建数据表的时候给时间类型的字段添加默认值约束
- 语法:
- ALTER TABLE table_name
- ADD CONSTRAINT constraint_name
- DEFAULT constant_expression [FOR column_name]
- 参数说明:
- table_name:要创建默认约束的表名称。
- constraint_name:默认约束名称。
- constant_expression:默认值。
- alter table tb_userinfo add constraint default_RegDateTime default getdate() for [RegDateTime]
这种做法比较保险。推荐!
总结
这个知识点再容易不过了,估计很多初学者都会踩这样的坑,不过还好,踩过了就长记性了,也是有好处的。为什么会有这样的问题?可能你对伙伴比较信任,潜意识觉得他肯定会在数据库中添加默认约束的。到最后中枪的还是自己。所以在设计程序,编写代码的时候,一定要严谨!
[SQL]躺着也中枪的datetime类型的更多相关文章
- 【AspNetCore】【WebApi】扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat)
扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat) 一.背景 大家在使用WebApi时,会用到DateTime为参数,类似于这 ...
- SQL中DATE和DATETIME类型不能直接作比较
如题,今天纠结了一天的问题. 在存储过程中定义了两个datetime类型的时间,然后把这个两个时间作为where条件中一个date字段between的两个时间段,结果无论如何都不执行... 就像 u ...
- 向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE('{0}','YYYY-MM-DD'))
需要指出的是,C#中有datetime类型,但是这个类型是包括小时,分钟,秒的.这个格式与数据库中的Date类型不符,如果将now设为datetime类型插入数据会失败. 需要通过TO_DATE('字 ...
- SQL server数据库中的DateTime类型出现的问题
我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经经常使用到的一种数据类型.而C#语言中也有DateTime类型,尽管二者都是用来描写叙述时间的,可是它们的默认值是不同 ...
- MVC自定义编辑视图,DateTime类型属性显示jQuery ui的datapicker
实现的效果为:在编辑视图中,对DateTime类型的属性,显示jQuery UI的datepicker.效果如下: Student.cs public class Student { ...
- Sqlserver:datetime类型的精度(不确定性)问题
转自http://www.xuebuyuan.com/212359.html 背景:近日进行大型数据表的迁移处理,遭遇创建 主键时 索引键值重复的错误.仔细检查原始表,并未有任何问题.分析后发现是迁移 ...
- [原创]Spring Boot + Mybatis 简易使用指南(二)多参数方法支持 与 Joda DateTime类型支持
前言 今天在开发练习项目时遇到两个mybatis使用问题 第一个问题是mapper方法参数问题,在参数大于一个时,mybatis不会自动识别参数命名 第二个问题是Pojo中使用Joda DateTim ...
- 在面试中忽然发现DateTime的一些...
今天说说我面试中碰到的一个小问题,在我问起DateTime为什么无法赋值NULL值,一般第一反应都认为它是值类型,不是引用类型,但随后我查阅了度娘自我学习到它是结构类型,那么随之而然就无法赋值NULL ...
- LINQ to SQL语句(14)之Null语义和DateTime
Null语义 说明:下面第一个例子说明查询ReportsToEmployee为null的雇员.第二个例子使用Nullable<T>.HasValue查询雇员,其结果与第一个例子相同.在第三 ...
随机推荐
- python下RSA加密解密以及跨平台问题
Reference: http://www.cnblogs.com/luchanghong/archive/2012/07/18/2596886.html 项目合作需要,和其他网站通信,消息内容采用 ...
- 一款基于jquery漂亮的按钮
之前为大家分享了好多css3实现的按钮.今天给大家分享一款基于jquery漂亮的按钮.这款按钮背景下用了一张图片.当鼠标经过的时候背景用半透明div遮住.一起看下效果图: 在线预览 源码下载 实现 ...
- 分享JQuery动画插件Velocity.js的六种列表加载特效
分享JQuery动画插件Velocity.js的六种列表加载特效.在这款实例中给中六种不同的列表加载效果.分别为从上飞入.从右侧飞入.从左侧飞入.和渐显.一起看下效果图: 在线预览 源码下载 实现 ...
- html5 canvas实现梦幻的3D刺猬球
今天要为大家带来一款html5 canvas实现的梦幻的3D刺猬球.页面非常梦幻.效果图如下: 在线预览 源码下载 html代码: <div> <canvas width=&qu ...
- Springmvc mvc:exclude-mapping不拦截 无效
最近在使用ssm框架搭建一个后台,需要判断每个请求都判断是否登录,未登录跳转到登录页面, 使用发现 mvc:exclude-mapping 不拦截,发现,怎么都无效,依然是进行拦截.查了很多资料,总算 ...
- oracle中普通视图和实体试图的区别
Oracle普通视图和实体化视图比较 来源:茂盛博客|2013-07-30 Oracle普通视图和实体化视图比较 相对于普通的视图来说,实体化视图的不同之处在于实体化视图管理存储数据,占据数据库的物理 ...
- 【Unity笔记】获得鼠标点击屏幕的位置,并转成世界坐标
Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
- 【C#】图像的变形/变换/扭曲。用Emgu或YLScsFreeTransform(FreeImageTransformation)或MagickImage
需求:将图像变形,如矩形图片变换成梯形的,图素拉伸. 解决方案:目前找到有两种. 使用EmguCV,它是.Net版的OpenCV.推荐直接在VS里的Nuget中搜索EmguCV进行下载. 使用第三方库 ...
- uboot全局数据gd_t、bd_t和device_t
gd_t定义在include/asm-arm/global_data.h 33 /* Keep it *SMALL* and remember to set CFG_GBL_DATA_SIZE &g ...
- HTML(一):HTML基本元素标签
一.什么是HTML HTML(Hypertext Markup Language):即超文本标记语言,是一种用来设计网页的标记语言,用该语言编写的文件,以.html或.htm为后缀,并且由浏览器解释执 ...