[SQL]躺着也中枪的datetime类型

写在前面

本来这个东西,我是不想在这里总结的,今天有初学者的朋友问我了,那就不得不说说了,你肯定也踩过这样的坑,没遇到,说明你运气好,编码习惯好。那还是言归正传吧。避免你中枪,还是扫一眼这篇文章吧。

一个例子

测试环境:sqlserver2012,vs2013

下面看一个简单的例子,例子非常简单,就不再写注释了。一个测试的数据表TB_UserInfo:

一个再简单不过的表,自增的id,用户名字,注册时间,从上图你也看到了,是允许为空的。

再弄一个简单的测试程序。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 using System.Data.SqlClient;
 8 namespace Wolfy.SQLDateTimeDemo
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             string strConn = "server=.;database=test;uid=sa;pwd=sa;";
15             string strSql = "insert into TB_userInfo values(@Name,@RegDateTime)";
16             UserInfo user = new UserInfo() { Name = "wolfy" };
17             try
18             {
19                 using (SqlConnection conn = new SqlConnection(strConn))
20                 {
21                     using (SqlCommand cmd = new SqlCommand(strSql, conn))
22                     {
23                         cmd.Parameters.Add(new SqlParameter("@Name", user.Name));
24                         cmd.Parameters.Add(new SqlParameter("@RegDateTime", user.RegDateTime));
25                         conn.Open();
26                         if (cmd.ExecuteNonQuery() > 0)
27                         {
28                             Console.WriteLine("注册成功");
29                         }
30                         else
31                         {
32                             Console.WriteLine("注册失败");
33                         }
34                     }
35                 }
36             }
37             catch (Exception ex)
38             {
39                 throw ex;
40             }
41         }
42     }
43     /// <summary>
44     /// 用户信息类
45     /// </summary>
46     class UserInfo
47     {
48         /// <summary>
49         /// 编号
50         /// </summary>
51         public int Id { set; get; }
52         /// <summary>
53         /// 姓名
54         /// </summary>
55         public string Name { set; get; }
56         /// <summary>
57         /// 注册时间
58         /// </summary>
59         public DateTime RegDateTime { set; get; }
60     }
61 }

我们知道,如果在使用类的属性的时候,你不为他赋值,则采用默认值。

可见它是有默认值的。

那我们继续往下走,再看看

出现了,这个异常,想必很多人都遇到过吧。

可以看出,vs中datetime类型的默认值与sqlserver中的datetime类型范围的确存在冲突。突然有这样的想法,为什么这两种默认值不兼容呢?考虑到现在的软件都会和数据库相结合,这样设计是不是有点不合理了?这东西,咱也是无法改变了,也只能选择接收了。尽量做到规范设计吧。

有两种做法可以解决这个问题:

方案一:

在添加数据的时候,为datetime类型的值赋值为当前时间。

1   UserInfo user = new UserInfo() { Name = "wolfy", RegDateTime=DateTime.Now };

方案二:

创建数据表的时候给时间类型的字段添加默认值约束

1 语法:
2 ALTER TABLE table_name
3 ADD CONSTRAINT constraint_name
4 DEFAULT constant_expression [FOR column_name]
5 参数说明:
6  table_name:要创建默认约束的表名称。
7  constraint_name:默认约束名称。
8  constant_expression:默认值。
1 alter table tb_userinfo add constraint default_RegDateTime default getdate() for [RegDateTime]

这种做法比较保险。推荐!

总结

这个知识点再容易不过了,估计很多初学者都会踩这样的坑,不过还好,踩过了就长记性了,也是有好处的。为什么会有这样的问题?可能你对伙伴比较信任,潜意识觉得他肯定会在数据库中添加默认约束的。到最后中枪的还是自己。所以在设计程序,编写代码的时候,一定要严谨!

时间: 2024-11-06 14:38:09

[SQL]躺着也中枪的datetime类型的相关文章

向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE(&#39;{0}&#39;,&#39;YYYY-MM-DD&#39;))

需要指出的是,C#中有datetime类型,但是这个类型是包括小时,分钟,秒的.这个格式与数据库中的Date类型不符,如果将now设为datetime类型插入数据会失败. 需要通过TO_DATE('字段','YYYY-MM-DD'))转换.如下: string.Format("insert into tablename (TIME) values(TO_DATE('{0}','YYYY-MM-DD'))",now) 错误写法: string.Format("insert in

SQL中DATE和DATETIME类型不能直接作比较

如题,今天纠结了一天的问题. 在存储过程中定义了两个datetime类型的时间,然后把这个两个时间作为where条件中一个date字段between的两个时间段,结果无论如何都不执行... 就像  update table1 set col1=2 where date1 between datetime1 and datetime2 这种. 高人勿笑,小弟记个笔记而已,总结走的弯路 -- 类型兼容性问题

SQL server数据库中的DateTime类型出现的问题

我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经常用到的一种数据类型,而C#语言中也有DateTime类型,虽然二者都是用来描述时间的,但是它们的默认值是不同的,这点必须注意,在开发过程中,二者之间相互适应关系处理不当,可能会产生不必要的麻烦,就等于浪费时间,所以记住.举个例子看看: 创建一个windows应用程序,创建一个用户信息实体类UserInfo.代码如下: 注意的是:用户信息类中的“操作日期”属性是日期类型. 再创建一个业务操作类,UserInfoOp

MVC自定义编辑视图,DateTime类型属性显示jQuery ui的datapicker

实现的效果为:在编辑视图中,对DateTime类型的属性,显示jQuery UI的datepicker.效果如下: Student.cs public class Student    {        public int Id { get; set; }        public string Name { get; set; }        public DateTime? JoinTime { get; set; }    } HomeController: public class

解决SQL Server 2005数据库中datetime时间字段在前端显示时分秒的问题

SQL Server 2005中时间类型datetime的格式是"年月日时分秒",直接读出来该字段,为了不让它在前端显示"时分秒"若是显示在dataGridView中,可以修改控件的某一列格式,如: dataGridView1.Columns[10].DefaultCellStyle.Format = "yyyy-MM-dd"; 但是要在listview控件中的话,就有点困难了,貌似没有类似的属性,这样的话,考虑从数据源入手. 1.获取当前年月日

LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法

在本系列中.主要介绍LINQ to SQL基础的东西,由于LINQ太强大了,它对我们寻常使用不同的数据源有着不同的内容,其包含对于SQL Server 数据库的LINQ to SQL:对于XML 文档的LINQ to XML.对于 ADO.NET 数据集的LINQ to DataSet.对于.NET 集合.文件.字符串等的LINQ to Objects.例外也出现了一些对LINQ支持的开源项目,比如LINQ to JSON,LINQ for NHibernate等等. 在这个系列中,一些关于LI

mybatis中Date和DateTime字段的插入

最近公司使用MyBatis3做数据持久层,在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,Date会对应mysql的Date类型. 在MyBatis映射文件中要表明映射类型. <result column="modified_date" jdbcType="TIMESTAMP" property="modified_date" javaType=&quo

显然他因为中枪已经没办法保持重心,子弹射偏了

“嵩山封禅台海拔982米,风向偏北风” 福克斯拉什知道,接下来短短的三秒将会决定整个大陆的命运,他需要立刻做出一个抉择. 角落射来一缕关切而温暖的目光,拉什知道是谁,但是终于没有忍住. 白色束腰配圆摆礼服,洁白的大沿遮帽上插着一根湛蓝色的加勒比鹦鹉的羽毛,珊莎,华山教派优尼科公爵的独女,清澈而明亮的目光直勾勾地看着台上的拉什,这一刻,拉什有点想放弃了. 珊莎 是 拉什的少年情人,对的,只是少年,想起 拉什心中又是一阵剧痛. 就在这一思忖之间,弄比格,衡山教大主教,一个值得尊敬的老家伙,举起了手中

sql点滴42—mysql中的数据结构

MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补. 表列出了各种数值类型以及它们的允许范围和占用的内存空间. 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0,65 535)