[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查询雇员,其结果与第一个例子相同.在第三 ...
随机推荐
- ucos-III基础教程汇总
目录: 1.ucos-III前言 2.uC/OS-III 概要 3.移植 uC/OS-III 到 STM32 4.调度器 5.uC/OS-III 时钟节拍,时间管理,时间片调度
- Windows获取线程起始地址
typedef enum _THREADINFOCLASS { ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePrior ...
- git中文乱码解决方案
解决方案: 在bash提示符下输入: git config --global core.quotepath false core.quotepath设为false的话,就不会对0x80以上的字符进行q ...
- Jquery easyui tree 一些常见操作
Tree: easyui tree的异步加载实现很简单,easyui的中文API文档中有实例(http://api.btboys.com/easyui/)——创建异步树形菜单,就是在tree node ...
- 分享10个原生JavaScript技巧
首先在这里要非常感谢无私分享作品的网友们,这些代码片段主要由网友们平时分享的作品代码里面和经常去逛网站然后查看源文件收集到的.把平时网站上常用的一些实用功能代码片段通通收集起来,方便网友们学习使用,利 ...
- VMWare 回收磁盘空间
两部分内容: 1) 实际操作体验下在vmware player里回收guest vm的磁盘空间,还给host: 2)顺便把之前的笔记翻出来关于vmware unmap/reclaim, 对照总结. 1 ...
- WPF查找子控件和父控件方法
一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...
- Android ArryaList 笔记
Arraylist相当于动态数组,可以动态的添加或者删除其中的元素. 参考链接 http://beginnersbook.com/2013/12/java-arraylist/ package com ...
- gpio irq
/***************************************************************** * gpio irq * * 一直以来都没了解过gpio的irq, ...
- C++ 编译器用于把源代码编译成最终的可执行程序
C++ 编译器写在源文件中的源代码是人类可读的源.它需要"编译",转为机器语言,这样 CPU 可以按给定指令执行程序. C++ 编译器用于把源代码编译成最终的可执行程序. 大多数的 ...