[原].NET数据库开发中请注意区域时间格式

本文描述了一个因不同地区时间格式差异导致的.NET(C#)应用在台湾与内地间移植时出现的问题。主要原因是代码生成的SQL插入语句中包含特定于地区的中文时间描述,在台湾的服务器上出现了“上午”字样,而内地的服务器则没有。这导致了数据库无法正确解析时间格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天又被人问一个曾经被问过好多次的问题.又再一次的解释一遍。写这么样一篇文章记录一下,以飨后来之人。

问题描述:

1Insert into table(col1,col2) values('2009-10-30 上午 21:00:00','2009-10-30 上午 21:00:00');

 table 是数据库中一张表的名称,col1,col2是两个datetime类型的字段,计划用.NET(C#)组织一条SQL语句向[table]这张表插入一笔记录.结果代码写好了,测试也通过了,把程序移到我们总公司(台湾)的服务器上却会出现错误.为什么呢?台湾的同事就很郁闷,然后内地的同事也很郁闷。(合作模式的关系,内地做开发,台湾做测试和需求,嗯,合作模式有很大的弊端)

    内地的同事说:我这边测试,明明就是OK的嘛!
    台湾的同事说:我这边测试,就是通不过的呀!
然后这么一个问题,被从周五拖到周一,然后找到我,然后才解决。
     我们分析一下环境和代码,就能理解为什么会造成这种状况。

    内地这边的开发机和数据库是 :windows xp简体中文版 sp2+ SQL Server 2005 简体中文开发版
    台湾的服务器和数据库是:windows 2003 繁体中文版+SQL Server 2005繁体中文服务器版

     .NET(C#)的代码大概如下所示:

ContractedBlock.gifExpandedBlockStart.gifCode
1protected string GenerateSQL()
2ExpandedBlockStart.gifContractedBlock.gif{
3    //一些业务上的赋值
4    //在这里我们只是简单模拟,没有任何意义
5   DateTime dtCol1=DateTime.Now;
6   DateTime dtCol2=DateTime.Now.AddDays(7);
7   string szSql="INSERT INTO [tableName](COL1,COL2) VALUES('"+dtCol1.ToString()+"','"+dtCol2.ToString()+"')";
8   return szSql;
9}

 

OK~~能看出什么问题了嘛?

是的,我们在组织SQL语句的时候是把默认的时间字符串输出并拼凑到SQL语句上的.这样子的话,如果我们在内地开发机上做测试和在台湾的服务器上运行会得到两种完全不同的结果.
内地测试运行的结果:

INSERT INTO [tableName](COL1,COL2) VALUES('2009-10-20 10:30:00','2009-10-27 10:30:00')

台湾服务器上的运行结果:

INSERT INTO [tableName](COL1,COL2) VALUES('2009-10-20 上午 10:30:00','2009-10-27 上午 10:30:00')

看出区别了嘛?在台湾的服务器上会出现 "上午" 的字符串标识.这时候,就要考虑数据库的排序问题了,如果数据库的排序使用了Chinese_PRC_xx_xx(简体中文的排序方式),那么一定会出现错误,因为代码的区域时间与数据库的排序不搭,这样子的话,在执行上面的插入语句时就会报时间格式错误,就不能使插入成功.

所以为了解决这个问题,在开发的时候需要注意区域时间的格式问题.

解决方法有两种:
(1)在.NET 的代码中,进行时间字符串的格式化.

dtCol1.ToString("yyyy-MM-dd HH:mm:ss")

(2)如果不在.NET代码中进行时间字符串的格式化,那么请修改数据库的排序规则,使代码和数据库使用相同的区域时间格式.

 选择要修改的数据库-->右键 "属性"-->选项-->排序规则:选择合适的排序规则

转载于:https://www.cnblogs.com/fromchaos/archive/2009/11/09/1599061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值