SQL语句的两次执行问题

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

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

 

目录
相关文章
|
SQL XML Oracle
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
372 0
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
|
SQL Java 数据库连接
springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用
springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用
489 0
springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用
|
SQL 存储 缓存
一文搞懂MySQL中一条SQL语句是如何执行的
一文搞懂MySQL中一条SQL语句是如何执行的
|
SQL 程序员 开发工具
【Sql Server】基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
433 0
【Sql Server】基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
|
SQL 关系型数据库 MySQL
SQL语句优化方法
SQL语句优化方法
136 0
|
SQL 数据库 数据安全/隐私保护
使用SQL语句 查询电话号码 加密显示
使用SQL语句 查询电话号码 加密显示
181 0
使用SQL语句 查询电话号码 加密显示
|
SQL 存储 安全
MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率
MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率
MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率
|
SQL 存储 关系型数据库
数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练(2)
数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练(2)
数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练(2)
|
存储 SQL 缓存
数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练(1)
数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练(1)
数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练(1)