昨天下午,写充值窗口时,出现了SQL语句被执行两次的问题。头痛了一下午和一晚上。
充值的窗口要操作两张表,一张是学生的基本信息表,就是将充值金额写入。另一张表,是用来存放本次充值的信息,比如:充值时间日期,谁充的钱。。。对前一张表的操作很快就写好了。但是在修改第二张表时,却出现了问题。
先来看一下代码:
'修改教师充值表 SQL3 = "insert into tearechargeinfo values('" & strCardNum & "','" & strUserName & "','" & ChargeDate & "','" & ChargeTime & "','" & RechargeRMB & "','" & "未结账" & "')" Call ExecuteSQL(SQL3, strMsg)
修改这个表就两条语句。但是执行后,每次都是这样的:
每次充值,都会出现两条一样的记录。额,,以前都是SQL语句写的不对,记录插入不到数据库里,但是这次怎么还买一赠一了啊?
我到底哪里错了??????这是我这一年来一直在问自己的问题。
查吧,不是数据库有问题,就是执行SQL语句时被重复执行了。
首先,是SQL SERVER数据库的检查:
手动插入,一条SQL语句插入的就是一条记录,看来数据库里没有连续触发这种事。。。。。。。
再查代码,也写的很对啊。。。如果SQL语句写的不对,那么肯定是一条都插入不进去的。所以,可能是代码在执行时,遇到了一个可以让代码重复执行的逻辑问题。
以前也用过SQL语句插入数据,那时都是执行给一个SQL语句,插入一条啊。这次,,这是几个意思啊。????
昨天晚上回去之后,仔细想了想。。终于想到可能是那个环节出了问题:
因为这个表没有定义主键,所以可以重复插入两条相同的记录。而以前我写的那些可以成功执行INSERT操作的表都是有主键的,主键会自带一个唯一性约束,所以,即使代码即使被重复执行了两次,它在第一次时成功插入了,第二次时再想插入一条相同记录时,却因为存在主键,被数据库拒绝插入。导致了我只看到了一旦执行插入,就会插入一条记录的结果。而这个表因为没有主键,就被插入了一条又一条。
为了验证猜测,在数据库里玩儿了个小实验:
在这个TeaRechargeInfo(无主键)里面,写了:
这个SQL语句会插入两条相同记录,下图为执行后的结果
说明在没有主键时,同时插入两条相同记录无压力。这个结论或许你早就知道,但是,下面这个你就可能没有试过了:
然后在一个有主键的表里面,试图同时插入两条记录
结果是,在插入第二次时,数据库因为检查到违反了主键约束,会自动终止这种操作。
后来,经检查,原来果然是模块里在执行SQL语句时执行了两次。
下面是原来的出错的代码段
cmd.Execute '执行SQL语句 '将查询的结果保存在recordset对象中 Set Rst = New ADODB.Recordset Rst.CursorType = adOpenKeyset '设置游标类型 Rst.LockType = adLockOptimistic '设置锁定类型 Set Rst = cmd.Execute() '将查询的结果保存在recordset对象中 Set ExecuteSQL = Rst '返回函数的结果
上面的:cmd.Execute 和SetRst = cmd.Execute()这两句话 ,有同一个效果,刚开始写的时候,只是想让command对象执行SQL操作,然后将结果通过SetRst = cmd.Execute()这句话赋值给R ecordset对象,没有考虑到,在赋值的过程中,SQL语句又被默默的执行了一遍。。。。。
找到了问题的症结,接下来,只要一针就能见血了。。。。
改后:
cmd.CommandText = Trim(SQL) '设置SQL语句 '将查询的结果保存在recordset对象中 Set Rst = New ADODB.Recordset Rst.CursorType = adOpenKeyset '设置游标类型 Rst.LockType = adLockOptimistic '设置锁定类型 Set Rst = cmd.Execute '执行SQL语句 Set ExecuteSQL = Rst '返回函数的结果
今晚,终于可以在繁星漫天下安然入眠了(借用《达芬奇密码》结尾,因为解决一个问题后,大概就是这种感觉了)。。。。。