Foxtable(狐表)用户栏目专家坐堂 → 删除时机的疑问


  共有2384人关注过本帖树形打印复制链接

主题:删除时机的疑问

帅哥哟,离线,有人找我吗?
scott518
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
删除时机的疑问  发帖心情 Post By:2014/9/1 10:28:00 [只看该作者]

在删除一表单数据时想同步将数据从事务提醒中删除,同时将删除表单的编号回收到编号记录表中;删除动作都是全部加入到SQL事务集合SQLLIST中通过函数来遍历执行的,直接从sql数据库中删除,如果有一个删除不成功,全部回滚。

 

请教下面的代码是要写在BeforeDeleteDataRow事件中还是DataRowDeleting事件中?

(现在我是写在BeforeDeleteDataRow中,目的是先用事务删除或更新后台sql数据中的相关数据再删除当前加载表中的行,当事务执行不成功回滚时就取消删除;

若是写在DataRowDeleting事件中,当sql事务执行不成功回滚后,加载表中的行也会被删除,结果是事务提醒中没删除,编号记录也没有回收,当前表中的数据却还是被删除了造成不一致。)

 

Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
Dim str As String
Dim dr As DataRow

str = "Delete from 事务提醒 where 单据名称 = '" & Mtb & "' and 单据编号 = '" & e.DataRow(Idcol) & "'"
SQLLIST.Add(str)

。。。

'如果有相同编号已用标识改为未启用,没有则将删除编号新增至编号记录表中
cmd.commandText = "Select Count(*) From {编号记录} Where 编号结构 = '" & pf & "' And 表名 = '" & tbname & "' and 顺序号 = " & sx
If cmd.ExecuteScalar > 0 Then
    str = "Update 编号记录 Set 已用标识 = 0 where  编号结构 = '" & pf & "' And 表名 = '" & tbname & "' and 顺序号 = " & sx
    SQLLIST.Add(str)
Else
    str = "Insert Into 编号记录 (表名,编号字段,编号结构,顺序号,已用标识) Values('" & tbname & "','" & cname & "','" & pf & "'," & sx & ",0)"
    SQLLIST.Add(str)
End If

 

If Functions.Execute("tp_SQL",SQLLIST) = "NG" Then
    e.cancel = True
End If

 

写在BeforeDeleteDataRow中是正确的吗?谢谢!


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/9/1 10:32:00 [只看该作者]

这个实践出真知,你测试一下就知道了。

 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/9/1 10:57:00 [只看该作者]

唉,老大总是喜欢卖关子,直接告诉一下不就行了。因为我就是使用中出现这种现象但自己不能确定才觉得疑惑的。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/9/1 11:00:00 [只看该作者]

 e.cancel = True 对于 DataRowDeleting 无效

 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/9/1 11:07:00 [只看该作者]

我知道因为deleting的e参数中没有它,所以我才写在BeforeDeleteDataRow中,

是不是一旦deleting动作发生,虽然帮助中说当前行还没有被删除,此时不管发生什么错误,这个动作已经无法停止,结果就是此行在加载表中一定会被删除(先不考虑删除后用户是否保存)?


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/9/1 11:11:00 [只看该作者]

 回复5楼,行是被删除了,只是还没有真正删除。最后保存或者加载的时候,会保存此行的删除


 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/9/1 11:50:00 [只看该作者]

因为我的思路是删除一行数据时,可能要更新其他表中的一些相关数据,为保持一致,就用事务先将这些相关表中的数据都更新完成,确保全部都更新了才回过头来删除当前行,因为事务已经更新了后台数据,为了防止用户不保存导致当前表的数据又没有删除,在删除行的按钮上也改成直接用sql语句删除并将删除加入到上面一起的事务中。

 

我有疑惑主要是两点:如果写在BeforeDeleteDataRow中,会不会出现事务把前面所有的都成功执行了,表中这个删除行的动作会不会意外中止?(不管什么原因,当然因为事务已执行即使本次表中没删除下次加载也会没有。相关表中的数据还是一致的)

如果写在DataRowDeleting中,因为事务中的任何一个可能没有成功执行回滚了所有的动作,但当前表中这个deleting动作已经执行却停不下来了?(这个删除动作最终就仅仅删除当前行,其他表数据就没有更新了)

 

这就是我选择写在BeforeDeleteDataRow中的原因,按楼上老师们的说法我这样写是正确的了?请明确指示!

 


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/9/1 11:51:00 [只看该作者]

 正确

 回到顶部