判断SQLSERVER数据库表字段为空的问题

摘要:
受支持的基类型是Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime和String。例如,当将Double转换为Single时,可能会发生精度丢失,但并不引发异常。但是,如果Double的值太大,无法由Single表示,则将引发溢出异常。有一组方法可支持字节数组与String或由以64为基的数字字符组成的Unicode字符数组之间的转换。表示为以64为基的数字的数据可以很容易地通过只能传输7位字符的数据信道进行传送。

今天在用遍历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类的返回值与指定类型的值等效的类型。受支持的基类型是 BooleanCharSByteByteInt16Int32Int64UInt16UInt32UInt64SingleDoubleDecimalDateTimeString

存在将每个基类型转换为每个其他基类型的转换方法。不过,所执行的实际转换操作分为三类:

  • 从某类型到它本身的转换只返回该类型。不实际执行任何转换。
  • 无法产生有意义的结果的转换引发 InvalidCastException。不实际执行任何转换。下列转换会引发异常:从 Char 转换为 BooleanSingleDoubleDecimalDateTime,以及从这些类型转换为 Char。下列转换会引发异常:从 DateTime 转换为除 String 之外的任何类型,以及从任何类型(String 除外)转换为 DateTime
  • 任何基类型(上面描述的基类型除外)都可以与任何其他基类型进行相互转换。

如果数字类型转换导致精度丢失(即某些最低有效位丢失),不引发异常。但是,如果结果超出了特定转换方法的返回值类型所能表示的范围,则将引发异常。

例如,当将 Double 转换为 Single 时,可能会发生精度丢失,但并不引发异常。但是,如果 Double 的值太大,无法由 Single 表示,则将引发溢出异常。

有一组方法可支持字节数组与 String 或由以 64 为基的数字字符组成的 Unicode 字符数组之间的转换。表示为以 64 为基的数字的数据可以很容易地通过只能传输 7 位字符的数据信道进行传送。

该类中的许多方法通过调用源对象上的对应 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的问题。

免责声明:文章转载自《判断SQLSERVER数据库表字段为空的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JavaScript加密库CryptoJS的使用el-calendar制作考勤显示的一些心得下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

张孝祥java高新技术 --- jkd1.5 新特性 -- 精华总结

1. 抽象方法的使用   如果一个方法中大量出现if语句, 那么, 就应该考虑使用抽象来处理. 如下例: package com.lxl; public class Weekend { //周日 public static Weekend SUN = new Weekend(); //周一...

nodejs中Buffer的创建和转换

  buffer是用来做什么?主要是用来处理二进制文件流和TCP流的文件缓存区。我们可以将二进制流和string,json,int进行转换,也可以进行复制,或者通过自带的函数进行判断buffer的一些状态。   创建Buffer对象(实例)     1.使用var buffer = new Buffer(size)创建对象,然后用buffer.fill(v...

MD5加密解密以及设置salt(盐值)

MD5算法 package com.oracle.jsp.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * * @author wjxing * */ public class MD5 {...

[C#]通过调用Word模板(Doc、dot)直接打印

通过替换模板中的指定 书签 来进行内容的替换、整合,然后直接发送到打印打印,也可以导出。即把打印出的语句换成保存函数。 public static classmyPrintByOffice { public static voidbyDoc(Stringtime,Stringuid) { Microsoft.Office.Interop.Word.Appl...

java 正则表达式

java 正则表达式 package com.project.utils; import org.apache.commons.lang.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ContentUtils {...

AutoCAD .NET二次开发(二)

今天专门讲一个——CommandMethod。我们都在知道CAD操作要快,必须要熟悉掌握各种命令。在Lisp开发中,在函数后C:即可添加一个命令,非常方法,在.NET API也可以非常方便的设置命令,它需要CommandMethod属性。 先来看CommandMethod的定义,它的构造函数很多,其中参数最全的一个如下图所示: groupName组名...