使用无效日期的问题
由于 GBase 数据库允许“0000-00-00”日期值存储到 Date 类型字段, “0000-00-00 00:00:00”和 NULL 时间日期值存储到 DateTime 类型,但这些日 期值都是无效的,.NET 框架的日期对象和日期时间对象不支持这些值。对于使 用无效日期的开发人员,日期处理上的差异可能产生问题。 因此.NET DataSet 对象不能使用 GBaseDataAdapter 类的 Fill 方法填充, 因为无效日期的转换将会引发 System.ArgumentOutOfRangeException 异常。
解决无效日期的方法
解决无效日期的方法有如下三种:限制无效日期、处理无效日期和处理 NULL 日期。
1、限制无效日期
日期问题的最好解决办法是限制用户输入无效日期,该方法可以在客户端 或服务器端任何一方实现。 1) 客户端实现: .NET Framework 为应用程序提供了日期控件,当应用程序需要输入日期时 使用日期控件完成输入。 2) 服务器端实现: 日期数据进入数据库时都可通过存储过程完成,无效日期的限制在存储过 程中完成。
2、处理无效日期
GBaseDateTime 数据类型支持 GBase 数据库支持的相同日期值,缺省情况下
GBaseDataReader.GetValue()方法会为有效日期值返回一个.NET DateTime 对
象,并且会为无效日期返回一个错误。可以更改这个缺省方式,让
GBaseDataReader.GetValue() 对于无效日期也返回一个 GBaseDateTime 对象。
要想使 GBase ADO.NET 为无效日期也返回一个 GBaseDateTime 对象,需要
在连接字符串中增加下面的键/值对:
Allow Zero Datetime=True
注意:使用 GBaseDateTime 类仍然可能产生问题,下面有一些结论:
无效日期的数据绑定仍然可能产生错误(0000-00-00 零日期不会产生 错误),如:2012-13-35;
ToString 方法返回按标准 GBase 数据库格式处理的日期(例如, 2005-02-23 08:50:25),这与.NET DateTime 类的 ToString 不同;
GBaseDateTime 类支持 NULL 日期,但是.NET DateTime 类不支持。如 事先不检查 NULL 就把一个 GBaseDateTime 转换为一个 DateTime 时, 会产生错误。
3、处理 NULL 日期
NET 的 DateTime 数据类型不支持 NULL 值,在查询中为 DateTime 类型变量 赋值时,必须首先检查该值是否为 NULL。使用 GBaseDataReader 得到 DateTime 列数据时,应在将获取到的值赋值给 DateTime 变量前用 IsDBNull 方法检查数 据是否值为 NULL,如下面的样例代码中所示。 C# 示例: if (! gsReader.IsDBNull(gsReader.GetOrdinal("gstime"))) gsTime = gsReader.GetDateTime(gsReader.GetOrdinal("gstime")); else gsTime = DateTime.MinValue;




