重构个人版机房收费系统错误积累与解决方案 一
系统经过自己的坚持不懈的努力终于做完了,接下来总结总结经验教训,颗粒归仓啦
1:在做注册新的学生(卡号时)出现以下错误
INSERT 语句与 FOREIGN KEY 约束"XXX"冲突。该冲突发生于数据库"XXX",表"XXX", column 'XXX。
我的代码期初是这样写的
[vb]
<span style="font-size:18px;"><span style="font-family:SimSun;">insert into T_Recharge_info(cardId,rechargeCash,rechargeDate,rechargeTime,strAdmin,isCheck) value(@cardId,@rechargeCash,@rechargeDate,@rechargeTime,@strAdmin,@isCheck )
insert into T_Card_info(cardId,studentId,balance,status,isCheck,strAdmin,regDate,regtime) values(@cardId,@studentId,@balance,@status,@isCheck,@strAdmin,@regDate,@regTime)
insert into T_Student_info(studentId ,studentName,易做图,department,grade,stuClass,studentStyle,strAdmin) values (@studentId,@studentName,@易做图,@department,@grade,@stuClass,@studentStyle,@strAdmin)</span></span>
错误截图:
[vb] www.zzzyk.com
<span style="font-size:18px;"><span style="font-family:SimSun;"><img src=/2013/0318/20130318113839669.png" alt=""></span></span>
原因:先看我的主外键关系:
解析理论:外键约束,比如B表存在一个字段b,有外键约束,引用于A表的主键a,那么在向B表插入数据时,字段b必须为A表中a已经存在的值,如过向b中存放一个a中没有的值,则会报违反外键约束。
,所有在向数据库中写入数据时先向主键表中写数据,(学生表-->卡表-->充值记录表)
正确写法:
[vb]
<span style="font-size:18px;"><span style="font-family:SimSun;">insert into T_Student_info(studentId ,studentName,易做图,department,grade,stuClass,studentStyle,strAdmin) values (@studentId,@studentName,@易做图,@department,@grade,@stuClass,@studentStyle,@strAdmin)
insert into T_Card_info(cardId,studentId,balance,status,isCheck,strAdmin,regDate,regtime) values(@cardId,@studentId,@balance,@status,@isCheck,@strAdmin,@regDate,@regTime)
insert into T_Recharge_info(cardId,rechargeCash,rechargeDate,rechargeTime,strAdmin,isCheck) values(@cardId,@rechargeCash,@rechargeDate,@rechargeTime,@strAdmin,@isCheck )</span></span>
2:当我退出程序时:创建窗口句柄时出错
原因:不要过分的相信垃圾回收机制,有时处理不好也报错,查了好多资料,发现原因很多的,具体原因自己进步学习中
现在程序没有这个问题了,具体原因不知道什么情况,请大侠帮忙哈.
3:从字符串""到类型double的转换无效
解决方法:字符串是不能直接相互加减的,它是字符的拼接了,我们需要当字符串中没有值时需要加强制类型转换
[vb]
<span style="font-family:SimSun;">select coalesce(sum(rechargeCash),0) as CustomerCash from T_Recharge_info where strAdmin=@userId and isCheck ='未结账'</span>
coalesce函数使返回第一个不为空的数,即可避免空的表达式的产生.
或者对文本框加以强制转换类型,方法多多
[vb]
<span style="font-family:SimSun;">CInt(cardID.text)</span>
4:未启用约束,一行或多行包含违法非空,唯一获外键约束的值
原因:查的的资料:
1) 因为架构信息已经硬编码进MyCustomers.cs,如果发生改动的话,必须重新生成。
2) 比如从拥有30个字段的某个表中选择3个字段A,B,C,专门为这三个字段生成一个强类型的DataSet1是可以的,但是倘若另一个方法需要选择字段C,D,E,还需要为这三个字段专门生成一个强类型的DataSet2。倘若select的字段由使用者自行定制,字段的一个组合就了不得了。
3) 为避免上面使用多个强类型DataSet的情况,我们可以只使用一个强类型DataSet,这样每次不管我们Fill多少个字段,都填充进一个强类型DataSet。
但这又带来了新的问题:
i)空间的浪费(特别是对于多表连接的情况)。可以写代码测试一下30个string字段中只填充1,2个占用的空间相对大小(使用强类型DataSet比弱类型占用内存大数倍不止)。
ii)约束的违反。强类型在生成时已经把数据库中的约束(如非空,FK等)添加了进来,这样在只填充部分数据时可能会发生违反约束的异常。
比如col1,col2,col3,col4都要求不为空,但是我只select了col1,col2进入强类型DataSet,这样对应记录的col3,col4字段均为空,违反了非空约束,会抛出异常并提示:
未处理的“System.Data.ConstraintException”类型的异常出现在 system.data.dll 中。
自己解决方案:需要充值编译生成就OK了
补充:软件开发 , Vb ,