当前位置:编程学习 > VB >>

重构个人版机房收费系统错误积累与解决方案 一

系统经过自己的坚持不懈的努力终于做完了,接下来总结总结经验教训,颗粒归仓啦
 
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,sex,department,grade,stuClass,studentStyle,strAdmin) values (@studentId,@studentName,@sex,@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,sex,department,grade,stuClass,studentStyle,strAdmin) values (@studentId,@studentName,@sex,@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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,