判断SQL-SERVER数据库表字段为空的问题
2006-06-01 15:22
246 查看
今天在用遍历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。
任何基类型(上面描述的基类型除外)都可以与任何其他基类型进行相互转换。
如果数字类型转换导致精度丢失(即某些最低有效位丢失),不引发异常。但是,如果结果超出了特定转换方法的返回值类型所能表示的范围,则将引发异常。
例如,当将 [b]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的问题。
[/b]
读取方法: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。
任何基类型(上面描述的基类型除外)都可以与任何其他基类型进行相互转换。
如果数字类型转换导致精度丢失(即某些最低有效位丢失),不引发异常。但是,如果结果超出了特定转换方法的返回值类型所能表示的范围,则将引发异常。
例如,当将 [b]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的问题。
[/b]
相关文章推荐
- ms sql server sql 查询所有数据库、表名、表字段总结
- 如何判断SQL SERVER中的某个数据库中的某个表是否有索引,并将索引名称显示出来?
- sql语句查询 sql server access 数据库里的所有表名,字段名
- SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
- 使用Source Safe for SQL Server解决数据库版本管理问题
- sql语句查询 sql server access 数据库里的所有表名,字段名
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题 Microsoft SQL Server Compact 3.5
- 无法用TCP/IP协议连接远端SQL Server EXPRESS 2005 数据库问题
- oracle sql通过判断条件更新数据库某个字段的值内容
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题 Microsoft SQL Server Compact 3.5
- Microsoft SQL Server 7.0数据库升级转换问题
- 问题总结:判断MS SQLSERVER临时表是否存在 drop table #tempcitys
- Oracle PL/SQL判断两个字段相等或不等问题
- 无法用TCP/IP协议连接远端SQL Server EXPRESS 2005 数据库问题
- SQL语句判断数据库、表、字段是否存在
- 通过FTP实现Internet上MS SQL Server数据库复制-调试问题
- 常用数据库查询判断表和字段是否存在的SQL
- SQL处理字段中字符判断的各种问题
- 在迁移数据库的过程中SQLServer SDE的问题
- sql server 中select 语句groupby字段问题