在机房的过程中代码写出来并不是就结束了,还有后期的调试,总会有那种让你想不到的各种错误出现,一个简单的注册功能 ,在我这里走的并不顺畅,为了减少运行的次数,我在同一个D层中进行了两次的insert操作,生成解决方案时并没有提示错误,但是最后的执行结果是可以插入到Card表中,不能插入到Student表中,我的D层代码代码如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">'插入到Card表 Dim Sql As String Dim table As Boolean Dim sqlParams As SqlParameter() = {New SqlParameter("@CardNo", card.Card), New SqlParameter("@StudentNo", card.Student), New SqlParameter("@Date", card.RDate), New SqlParameter("@Time", card.RTime), New SqlParameter("@Balance", card.BL), New SqlParameter("@ID", card.ID), New SqlParameter("@Check", card.Check), New SqlParameter("@Type", card.CardType), New SqlParameter("@Status", card.CardStatus)} Sql = "Insert into Card_Info(CardNo,StudentNo,RegisterDate,RegisterTime,Balance,IsCheck,userID,Type,Status) Values(@CardNo,@StudentNo,@Date,@Time,@Balance,@Check,@ID,@Type,@Status)" table = sqlHelper.ExecAddDelUpdate(Sql, CommandType.Text, sqlParams) </span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"> If table = True Then '插入到Student表 Dim Asql As String Dim flag As Boolean Dim params As SqlParameter() = {New SqlParameter("@StudentNo", student.Student), New SqlParameter("@Name", student.StudentName), New SqlParameter("@Sex", student.StudentSex), New SqlParameter("@Department", student.Dept), New SqlParameter("@Grade", student.StudentGrade), New SqlParameter("@Class", student.StudentClass), New SqlParameter("@Comment", student.SCommant)} Asql = "Insert into Student_Info(StudentNo,Name,Sex,Department,Grade,Class,Comment) Values(@StudentNo,@Name,@Sex,@Department,@Grade,@Class,@Comment)" flag = sqlHelper.ExecAddDelUpdate(Asql, CommandType.Text, params) Return flag End If Return table</span>首先进行逐步调试, 进行逐步调试显示插入Student表时最后flag的返回值是flase,在sqlHelper中它会走错误处理的那一句话, 但是就这样在sqlhelper中走过去了,并没有给出任何错误的提示,让我觉得应该就是D层的代码出问题了。
然后开始检查代码是不是不细心有写错的地方,但是经过详细检查之后觉得没有错,还把代码放到数据库中进行查询,结果显示是正确的,
最后我将插入的顺序调换,首先插入Student表,再插入Card表,最后结果是Student表插入成功,但是Card的并没有,通过这个结果我更坚信我的代码没有问题,我开始怀疑是不是代码的不应该这样写,我的逻辑有问题,但是又觉得没错,就这样请了好几位同学帮我检查,还是没有解决,一直到郑大神。
下面说一下郑大神的解决思路,和我一样进行调试,最后发现是在sqlHelper那里没有给出错误提示,马上说我错误处理的代码写的不好,我原来的sqlhelper的代码如下
加上错误处理进行提示后的代码如下:
这样进行运行会弹出错误提示如下:
这样可以知道“变量名在查询批次或存储过程内部必须唯一”这一重要的提示信息,所以很容易找到错误,我两次插入代码充都用到了@StudentNo这个名字
解决方法就是将其中一个@StudentNo修改一下就可以了。就这样困惑我的这个问题就这样解决了。
ps:以上的代码是前期写的,还存在一定的问题,实体的名字应该和数据库中字段的名字是统一的,有什么错误还请大家指正。
总结:
一个简单的错误困扰自己很长时间,花费了很长时间最后解决掉令自己还是很开心的。我的调试让我坚信我的插入的那块代码没有写错,通过这个过程让我明白“你以为的并不是对的”。这个过程让我体会到调试的重要性,同样的调试却又不同的结果,一句简单的代码就让错误浮出水面,所以代码的编写很重要。遇到错误如果实在解决不出来就去请教一下别人,也许会收获更多,可以向别人学习到排错的技巧。