购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱19
意想不到
——SQL Server数据库中DateTime类型的溢出陷阱

1.陷阱产生的场景

SQL Server数据库中的DateTime类型是数据库应用程序开发中经常用到的一种数据类型,而C#语言中也有DateTime类型,虽然这二者都用来描述时间,但它们的默认值并不相同。在程序开发过程中,若对这二者之间的相互适应关系处理不当,很可能存在隐患。

例4.19 SQL Server数据库中DateTime类型的溢出陷阱(光盘位置:光盘\MR\Instance\ 4\19\UseDateTime),该实例的实现过程如下。

本实例实现登记软件的操作用户,首先创建一个Windows应用程序,在应用程序下面创建一个用户信息实体类,命名为UserInfo,该类的代码如下:

提示

用户信息实体中的“操作日期”属性是日期类型。

然后在应用程序下面创建一个业务操作类,命名为UserInfoOperate,并在该类中添加一个自定义方法,命名为InsertUserInfo。该方法实现向用户表中添加用户记录,该方法的参数是UserInfo类型,代码如下:

最后在应用程序的默认窗体Form1中添加两个按钮和3个文本框,分别用来实现添加用户记录、退出窗体及输入用户信息。在“添加”按钮的Click事件中调用InsertUserInfo方法,实现插入用户信息的功能,代码如下:

注意

上面代码中没有给用户信息实体中的“登记日期”属性赋值,而是使用C#的DateTime类型的默认值。

在默认窗体Form1的3个文本框中分别录入用户代码、用户名称和用户密码,然后单击“添加”按钮,这时程序弹出如图4.37所示的异常信息提示窗口,异常窗口中显示“从char数据类型到datetime数据类型的转换导致datetime值越界。语句已终止。”

2.陷阱的分析

从错误信息中初步确认,应该与实体中日期类型的属性有关系。于是添加对实体中OperateDate属性的快速监视,发现该日期值为“0001-1-1 0:00:00”,如图4.38所示。

图4.37 异常提示

图4.38 快速监视

提示

在给用户信息实体的属性赋值时,并没有给登记日期属性赋值,而是使用了C#的DateTime类型的默认值,该默认值是“0001-1-1 0:00:00”。

在SQL Server数据库中,DateTime类型的值必须是1753年1月1日~9999年12月31日之间的日期。0001年明显小于1753年,所以才会出现上面的错误。

3.陷阱的解决方法

根据上面的分析可知,不可以把C#的DateTime类型的默认值保存到SQL Server数据库的DateTime字段中。本实例采用的解决方法是在调用InsertUserInfo方法之前给实体中的登记日期属性赋一个数据库能够接受的日期值,代码如下: 2Yk4ifAWpejjOGs1zrA3NR8n3CJ+b8p63XCbFUPG2X+F8xxm7QV0AXjCjJmZvHtN

点击中间区域
呼出菜单
上一章
目录
下一章
×