SQL语句的两次执行问题

     昨天下午,写充值窗口时,出现了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        '返回函数的结果

今晚,终于可以在繁星漫天下安然入眠了(借用《达芬奇密码》结尾,因为解决一个问题后,大概就是这种感觉了。。。。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值