今天在做项目的时候,无意间犯了一个错误,出现了:无法将类型为“System.DBNull”的对象强制转换为类型“System.String”。的错误提示。想着很多的初学者可能会遇上同样的问题,现在分析出现的问题,并解决之。
问题:用强类型DataSet 获取Oracle数据,其中一个字段值为DBNull,报错:无法强制转换成String。
详细错误信息如下所示:
无法将类型为“System.DBNull”的对象强制转换为类型“System.String”。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidCastException: 无法将类型为“System.DBNull”的对象强制转换为类型“System.String”。
源错误:
行 5092: get {
行 5093: try {
行 5094: return ((string)(this[this.tableBRN_YXJX_MN_ATTACHED.AUDITER_CODEColumn]));
行 5095: }
行 5096: catch (global::System.InvalidCastException e) {
后面还有很多的,就不再累述了。
出现问题的原因如下:
数据库中很多字段是空值,但是需要加载到数据控件中,于是在默认的情况下就会出现问题了。因为微软在设计的时候就是默认的数据字段在加载的时候如果实例数据为空就会抛出异常,正是由于微软这个非常人性化的设计出现了上述的错误。
解决的方案:方案很多,这里就说说几种简单方便的方案。
1、打开强类型DataSet的设计视图,找到报错的列,选择此列,在【属性】窗口中可以看到一个设置
选项:
NullValue。
这个值有三个选项:Null,Empty,Throw exception
选择Null或者Empty就OK了。
这个选项用于设置如果所取数据的这个字段值为NullValue时的处理办法。
默认是第三个选项:抛出异常。
修改后就OK了!
2、可以改写SQL在 字段添加ISNULL(["你的要查询的字段"],0);这个的效果是如果这个字段的值是空那转成"0";
3、 在读取时价格判断,if(读的值!=“”){读取值,赋值;}这个是如果读的值不为空就执行赋值的操作
4、sdr.IsDBNull(5) ? string.Empty : sdr.GetString(5);这样问题就会迎刃而解了。