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()这句话赋值给Recordset对象,没有考虑到,在赋值的过程中,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        '返回函数的结果

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

 

时间: 2024-09-17 08:55:03

SQL语句的两次执行问题的相关文章

怎样写SQL语句取两个日期之间的年月作为列名,两个日期是变量的

问题描述 怎样写SQL语句取两个日期之间的年月作为列名,两个日期是变量的比如 我取2000-01 到2011-12之间的年月在 test表里 id name1张山2张三3李四弄成这样id name 2000-01 2000-01 2000-01 2000-01 2000-01~~~2011-06 1张山NULLNULLNULLNULLNULL NULL2张三NULLNULLNULLNULLNULL NULL3李四NULLNULLNULLNULLNULL NULL我用这种方法写,不过它报错.dec

dba-一个sql语句是哪个DBA执行的?

问题描述 一个sql语句是哪个DBA执行的? 有10个DBA,每个人执行10条sql语句,有一条sql语句导致数据丢失,用的都是相同的用户和密码,怎么查出那条sql语句是哪个DBA执行的? 解决方案 看看SQL执行时间.看这个时间段谁在操作数据库.另外可以看看操作的机器名.可以看看哪个数据库,然后找一下对应日志.如果日志没开,那就没办法了. 解决方案二: 要是能区分,还要那么多用户名密码干嘛,干脆所有人都用一个用户名好了. 但是也不是绝对没办法,比如调看门卫的监控录像,把这10个人分开同时审问,

一个客户端程序,有自己的数据库文件,当程序需要升级并且更改数据结构时,SQL语句应该放在哪里执行?

问题描述 一个客户端程序,有自己的数据库文件,当程序需要升级并且更改数据结构时,SQL语句应该放在哪里执行? 如题,开发了一个windows客户端的程序,使用了SQLITE作为数据库,setting.db就是数据库文件.由于客户端升级有时需要更改数据结构,比如加个字段什么的,这个时候就有个问题了,如果要让升级之后原来的数据库文件还能用,需要执行一次更改数据结构的SQL,但是这个更改数据结构的SQL应该放在哪里执行?才能确保它能被执行并且只被执行一次? 解决方案 不知道描述清了没,就是类似发一条S

sql语句-如何用SQL语句实现两张表(无关联)查询后,分别将各自的一个字段,插入一个新表。

问题描述 如何用SQL语句实现两张表(无关联)查询后,分别将各自的一个字段,插入一个新表. 有A.B.C三张表如下, 表 A 表B 学生ID(主键) 学生名称 课程ID(主键)| 课程名称 表 C 学生ID 课程ID (联合主键) 那么,通过SQL语句操作如何用学生姓名和课程名(只能获取学生姓名和课程名)将课程ID和学生ID插入到C表(C表中有课程ID和学生ID并且是联合主键),感激不尽. 解决方案 你可以定义2个变量,分别从表A表B用名称查询到ID.在表C的新增语句中使用这2个变量. 不过你这

JAVA无法执行SQL语句,在Postgresql中执行正常?不知道什么原因

问题描述 SQL语句如下:java中执行语句如下:sql="selectname,num,asText(geom)asgeom,addressfromhzpbwherehzpb.c_idin(selectc_idfromcitywherec_namelike'%江%')"rs=stmt.executeQuery(sql);在java中就是无值输出 解决方案 解决方案二:该回复于2009-04-13 13:08:35被版主删除解决方案三:子查询里没有值吧

SQL语句计算两个日期之间有多少个工作日的方法_MsSql

/* 因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日. 设定是一个星期有5个工作日,从星期一到星期五 说明:   第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天   末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:   如果两个日期处在同一个星期内,直接计算"第一个星期的工作日数"   否则按下面的公式计算     (两个日期间的总天数 - 第一个星期的天数 -

同一个sql语句 连接两个数据库服务器_MsSql

exec sp_addlinkedserver '逻辑名称','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin '逻辑名称','false',null,'用户名','密码' go 建立完成之后就可以正常使用了 select * from 逻辑名称.数据库名称.dbo.表名称 这是一个完整的sql语句 使用完成之后要,删除掉建立的虚拟连接 exec sp_dropserver '逻辑名称','droplogins'

SQL语句计算两个日期之间有多少个工作日的方法

/* 因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日. 设定是一个星期有5个工作日,从星期一到星期五 说明:   第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天   末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:   如果两个日期处在同一个星期内,直接计算"第一个星期的工作日数"   否则按下面的公式计算     (两个日期间的总天数 - 第一个星期的天数 -

同一个sql语句 连接两个数据库服务器

exec sp_addlinkedserver '逻辑名称','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin '逻辑名称','false',null,'用户名','密码' go 建立完成之后就可以正常使用了 select * from 逻辑名称.数据库名称.dbo.表名称 这是一个完整的sql语句 使用完成之后要,删除掉建立的虚拟连接 exec sp_dropserver '逻辑名称','droplogins'