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

系统经过自己的坚持不懈的努力终于做完了,接下来总结总结经验教训,颗粒归仓啦


1:在做注册新的学生(卡号时)出现以下错误

INSERT 语句与 FOREIGN KEY 约束"XXX"冲突。该冲突发生于数据库"XXX",表"XXX", column 'XXX。  


我的代码期初是这样写的

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)


错误截图:



原因:先看我的主外键关系:




解析理论:外键约束,比如B表存在一个字段b,有外键约束,引用于A表的主键a,那么在向B表插入数据时,字段b必须为A表中a已经存在的值,如过向b中存放一个a中没有的值,则会报违反外键约束。

,所有在向数据库中写入数据时先向主键表中写数据,(学生表-->卡表-->充值记录表)


正确写法:

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 )



2:当我退出程序时:创建窗口句柄时出错



原因:不要过分的相信垃圾回收机制,有时处理不好也报错,查了好多资料,发现原因很多的,具体原因自己进步学习中

现在程序没有这个问题了,具体原因不知道什么情况,请大侠帮忙哈.


3:从字符串""到类型double的转换无效




解决方法:字符串是不能直接相互加减的,它是字符的拼接了,我们需要当字符串中没有值时需要加强制类型转换

select coalesce(sum(rechargeCash),0) as CustomerCash from T_Recharge_info where strAdmin=@userId and isCheck ='未结账'

coalesce函数使返回第一个不为空的数,即可避免空的表达式的产生.


或者对文本框加以强制转换类型,方法多多

CInt(cardID.text)



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了

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值