[原].NET数据库开发中请注意区域时间格式
今天又被人问一个曾经被问过好多次的问题.又再一次的解释一遍。写这么样一篇文章记录一下,以飨后来之人。
问题描述:
table 是数据库中一张表的名称,col1,col2是两个datetime类型的字段,计划用.NET(C#)组织一条SQL语句向[table]这张表插入一笔记录.结果代码写好了,测试也通过了,把程序移到我们总公司(台湾)的服务器上却会出现错误.为什么呢?台湾的同事就很郁闷,然后内地的同事也很郁闷。(合作模式的关系,内地做开发,台湾做测试和需求,嗯,合作模式有很大的弊端)
内地的同事说:我这边测试,明明就是OK的嘛!
台湾的同事说:我这边测试,就是通不过的呀!
然后这么一个问题,被从周五拖到周一,然后找到我,然后才解决。
我们分析一下环境和代码,就能理解为什么会造成这种状况。
内地这边的开发机和数据库是 :windows xp简体中文版 sp2+ SQL Server 2005 简体中文开发版
台湾的服务器和数据库是:windows 2003 繁体中文版+SQL Server 2005繁体中文服务器版
.NET(C#)的代码大概如下所示:
OK~~能看出什么问题了嘛?
是的,我们在组织SQL语句的时候是把默认的时间字符串输出并拼凑到SQL语句上的.这样子的话,如果我们在内地开发机上做测试和在台湾的服务器上运行会得到两种完全不同的结果.
内地测试运行的结果:
台湾服务器上的运行结果:
看出区别了嘛?在台湾的服务器上会出现 "上午" 的字符串标识.这时候,就要考虑数据库的排序问题了,如果数据库的排序使用了Chinese_PRC_xx_xx(简体中文的排序方式),那么一定会出现错误,因为代码的区域时间与数据库的排序不搭,这样子的话,在执行上面的插入语句时就会报时间格式错误,就不能使插入成功.
所以为了解决这个问题,在开发的时候需要注意区域时间的格式问题.
解决方法有两种:
(1)在.NET 的代码中,进行时间字符串的格式化.
(2)如果不在.NET代码中进行时间字符串的格式化,那么请修改数据库的排序规则,使代码和数据库使用相同的区域时间格式.
选择要修改的数据库-->右键 "属性"-->选项-->排序规则:选择合适的排序规则