以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 删除时机的疑问 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=56216) |
-- 作者:scott518 -- 发布时间:2014/9/1 10:28:00 -- 删除时机的疑问 在删除一表单数据时想同步将数据从事务提醒中删除,同时将删除表单的编号回收到编号记录表中;删除动作都是全部加入到SQL事务集合SQLLIST中通过函数来遍历执行的,直接从sql数据库中删除,如果有一个删除不成功,全部回滚。
请教下面的代码是要写在BeforeDeleteDataRow事件中还是DataRowDeleting事件中? (现在我是写在BeforeDeleteDataRow中,目的是先用事务删除或更新后台sql数据中的相关数据再删除当前加载表中的行,当事务执行不成功回滚时就取消删除; 若是写在DataRowDeleting事件中,当sql事务执行不成功回滚后,加载表中的行也会被删除,结果是事务提醒中没删除,编号记录也没有回收,当前表中的数据却还是被删除了造成不一致。)
Dim cmd As New SQLCommand str = "Delete from 事务提醒 where 单据名称 = \'" & Mtb & "\' and 单据编号 = \'" & e.DataRow(Idcol) & "\'" 。。。 \'如果有相同编号已用标识改为未启用,没有则将删除编号新增至编号记录表中
If Functions.Execute("tp_SQL",SQLLIST) = "NG" Then
写在BeforeDeleteDataRow中是正确的吗?谢谢! |
-- 作者:狐狸爸爸 -- 发布时间:2014/9/1 10:32:00 -- 这个实践出真知,你测试一下就知道了。 |
-- 作者:scott518 -- 发布时间:2014/9/1 10:57:00 -- 唉,老大总是喜欢卖关子,直接告诉一下不就行了。因为我就是使用中出现这种现象但自己不能确定才觉得疑惑的。 |
-- 作者:有点甜 -- 发布时间:2014/9/1 11:00:00 -- e.cancel = True 对于 DataRowDeleting 无效 |
-- 作者:scott518 -- 发布时间:2014/9/1 11:07:00 -- 我知道因为deleting的e参数中没有它,所以我才写在BeforeDeleteDataRow中, 是不是一旦deleting动作发生,虽然帮助中说当前行还没有被删除,此时不管发生什么错误,这个动作已经无法停止,结果就是此行在加载表中一定会被删除(先不考虑删除后用户是否保存)? |
-- 作者:有点甜 -- 发布时间:2014/9/1 11:11:00 -- 回复5楼,行是被删除了,只是还没有真正删除。最后保存或者加载的时候,会保存此行的删除 |
-- 作者:scott518 -- 发布时间:2014/9/1 11:50:00 -- 因为我的思路是删除一行数据时,可能要更新其他表中的一些相关数据,为保持一致,就用事务先将这些相关表中的数据都更新完成,确保全部都更新了才回过头来删除当前行,因为事务已经更新了后台数据,为了防止用户不保存导致当前表的数据又没有删除,在删除行的按钮上也改成直接用sql语句删除并将删除加入到上面一起的事务中。
我有疑惑主要是两点:如果写在BeforeDeleteDataRow中,会不会出现事务把前面所有的都成功执行了,表中这个删除行的动作会不会意外中止?(不管什么原因,当然因为事务已执行即使本次表中没删除下次加载也会没有。相关表中的数据还是一致的) 如果写在DataRowDeleting中,因为事务中的任何一个可能没有成功执行回滚了所有的动作,但当前表中这个deleting动作已经执行却停不下来了?(这个删除动作最终就仅仅删除当前行,其他表数据就没有更新了)
这就是我选择写在BeforeDeleteDataRow中的原因,按楼上老师们的说法我这样写是正确的了?请明确指示!
|
-- 作者:有点甜 -- 发布时间:2014/9/1 11:51:00 -- 正确 |