今天,需要解决昨天运维日志上出现的问题。
出错标题是:指定的转换无效。如图:
这个问题估计做开发常出现了,但主要说明的是,如果在新增字段时,我们就使用Not NULL 再加 Default(0)去约束(字段是int类型),就可以避免这种问题了。
解决问题的方法:
1.重现问题:
1).通过行定位,发现是获取值时,没有用DBNullHandler.getInt32(xxx),而是直接用了(int)(row[xx]),导致出错(因为该字段是可空类型),如图:
2).修改后,测试成功
这种情况,其实是可以避免 ,比如象一些数值类型,可以在SQLSERVER定义的时候,就加上 NOT NULL Default 0;因为这个字段就是计算一个使用积分
的字段,默认都是0,如果有使用程序会计算并赋值。而我一开始做时,设置为NULL,导致比较多地方参加运算时,还要判断是否有值,维护起来麻烦,维护成本算起来不划算。
3).补救方法:
UPDATE 表名 SET 字段=0 WHERE 字段 IS NULL
GO
ALTER TABLE 表名 ADD CONSTRAINT DF_表名_字段 DEFAULT 0 FOR 字段
GO
4)验证测试的目的:确认线上运行的程序如我们预期一样。
情况是线上运行几个应用,有H5商城,有小程序,H5商城已经不维护,但仍会有客人访问,因此,我们也需要只少让客人访问时不出错。
我们需要确认新增记录时,不会出错。
因我们的底层是调用Insert语句,执行完上面的SQL后,我们直接在SQLSERVER上测试:
1.Insert Into (…) select … from 表名;这时忽略字段,SQLSERVER会自动设置为0
2.Insert Into (…,该字段名)select … NULL from 表名;这时插入的值为NULL,SQLSERVER会设置为NULL
正好H5商城的项目底层没有加这个字段,因此它运作的结果是第一句的结果。