今天在用遍历dataset所有记录时(把dataset中的字段值读出并赋给各TextBox的Text属性),
读取方法:TextBox3.Text=Convert.ToString(dataSet11.msg_info[a].msg_receiver),a是一变量,利用button_click触发其自增,
用以上方法当读取到一条类型为datatime的空字段时,系统就会报错:InvalidCastException 类型无法转换。(开始并不知道)
后来查了MSDN,原因在于:从 DateTime 转换为除 String 之外的任何类型,以及从任何类型(String 除外)转换为 DateTime,均会产生异常。
详细的Convert类说明如下:
Convert类的返回值与指定类型的值等效的类型。受支持的基类型是 Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime 和 String。
存在将每个基类型转换为每个其他基类型的转换方法。不过,所执行的实际转换操作分为三类:
从某类型到它本身的转换只返回该类型。不实际执行任何转换。 无法产生有意义的结果的转换引发 InvalidCastException。不实际执行任何转换。下列转换会引发异常:从 Char 转换为 Boolean、Single、Double、Decimal 或 DateTime,以及从这些类型转换为 Char。下列转换会引发异常:从 DateTime 转换为除 String 之外的任何类型,以及从任何类型(String 除外)转换为 DateTime。 任何基类型(上面描述的基类型除外)都可以与任何其他基类型进行相互转换。
如果数字类型转换导致精度丢失(即某些最低有效位丢失),不引发异常。但是,如果结果超出了特定转换方法的返回值类型所能表示的范围,则将引发异常。
例如,当将 Double 转换为 Single 时,可能会发生精度丢失,但并不引发异常。但是,如果 Double 的值太大,无法由 Single
有一组方法可支持字节数组与 String
该类中的许多方法通过调用源对象上的对应 IConvertible 显式接口实现方法,将源对象转换为目标对象。如果不存在这样的方法,则将引发 InvalidCastException。
该类中的一些方法带一个实现 IFormatProvider 接口的参数对象。该参数可以提供区域性特定的格式设置信息以帮助转换过程。基值类型忽略该参数,但任何实现 IConvertible
看过以上说明,也就知道了为什么我的数据库中有其它字段也是空的但在赋值却没有出错的原因了,
知道出错的原因解决的方法就是:在把数据库中的数据读出前先对其值做判断,若为空则赋一空值给相应的TextBox,如下:
if (Convert.IsDBNull(dataSet11.Tables["msg_info"].Rows[a]["msg_receiver"]))
{TextBox3.Text="";}
else
{TextBox3.Text=Convert.ToString(dataSet31.msg_info[a].msg_receiver);}
这样就不会出错了。
关于以上问题,微软的建议是:所有的转换无论系统是否默认支持转换,均先进行是否为空判断,以保证数据安全。
问题是解决了,可以仍然觉得不太舒服,既然系统能够判断出是DBnull,为什么不帮用户自动赋一个空值以实现自动转换呢?真是浪费时间!!!还是有其它原因呢?小样的Microsoft!!!!
对DateTime的Null值进行了处理 (3.2.0.1开始支持)
如果要对DateTime类型的字段赋于Null值,只需要使用DateTime.MinValue即可:
aEntity.CreateDate=DateTime.MinValue;
在SPL内部会判断如果DateTime.MinValue的话,自动保存到数据库为System.DBNull.Value,这就解决了不能给 DateTime类型直接赋于System.DBNull.Value的问题。