Foxtable(狐表)用户栏目专家坐堂 → 事务处理不一致的问题


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

主题:事务处理不一致的问题

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
事务处理不一致的问题  发帖心情 Post By:2014/11/18 18:11:00 [只看该作者]

订单表在新增一行时。
在beforesavedatarow代码中用下面的代码在新增行保存时记录到日志表中
If e.DataRow.RowState = DataRowState.Added Then
   xgfs = "新增"
   str = "Insert Into Log (修改时间,操作者,部门,修改方式,表名,单据编号,识别号,辅助识别号,行号) Values('" & Date.Now() & "','" & MyName & "','" & MyGroup & "','" & xgfs & "','" & tb & "','" & e.DataRow(Idc) & "','" & e.DataRow(Idc1) & "','" & e.DataRow(Idc2) & "'," & e.DataRow("_Identify") & ")"
SQLLIST.Add(str)
end if

是通过调用下面的事务函数来统一执行的,
Dim SqlList As List(of String) = Args(0)
Try
    Connections(Mydata).BeginTransaction() '开始事务
    Dim cmd As new SQLCommand
    cmd.ConnectionName = Mydata
    For Each sql As String In SqlList
        cmd.CommandText = sql
        cmd.ExecuteNonQuery()
    Next
    Connections(Mydata).Commit()  '提交事务
    sqlList.Clear()  '清空集合
    Return "OK"
Catch ex As Exception
    Connections(Mydata).Rollback()  '回滚事务
    msgbox(ex.tostring)      '返回错误信息
    sqlList.Clear()  '清空集合
    Return "NG"
End Try

问题是:Log记录表中却记录了这条新增的记录,但记录"_Identify"的行号列的值却0;而在后台数据据订单表中查不到这条记录,按上面的事物应该如果新增订单表不成功,那Log中的记录也会回滚也没有才对,为什么会这样,并且“_Identify”为什么会有等于0的情况?

谢谢!


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


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

 例子发上来,代码不应该有你这种情况。

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


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

 再有一个,在save之前 _Identify 不是真实的 _Identify,保存之后,才会生成真正的,但不应该有0的出现。

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 19:18:00 [只看该作者]

每个月偶尔会出现一两次这样的情况,所以做的例子也很难重现,
那"_Identify"的值什么情况下会为0呢?

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


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

 是不是你合成语句的时候有问题?

 

 比如,有特殊字符 ' \ " 等,最后影响了生成的语句


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


加好友 发短信
等级:版主 帖子:1693 积分:12135 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2014/11/18 19:42:00 [只看该作者]

_Identify 为什么为0 俺不知道

 

但你的事务用法好像不妥

 

 

Log 和 行保存 好像不在一个事务中


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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 20:02:00 [只看该作者]

请教逛逛版主,这个事务用法哪里不妥呢?行保存时的所有相关更新其他表单数据的SQL语句是在表的beforesavedatarow事件中添加到sqllist集合中的,而日志Log是统一在全局事件beforesavedatarow代码中再加到sqllist集合中的,而在全局事件代码的最后一行才用
If Functions.Execute("tp_SQL",SQLLIST) = "NG" Then
    e.cancel = True
End If
来统一执行所有的事务,这样不对吗?
因为偶尔会有些单据行莫明其妙的丢失掉,这个问题困扰很久但一直找不到原因,请帮忙指点一下。谢谢!

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


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

 insert into 语句生成有问题,特殊字符会影响最后的语句生成的,比如 \ ' "


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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 20:10:00 [只看该作者]

甜老师,但合成的语句中都没有这些特殊字符啊

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


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

 那你记录一些其他其它信息,不要单独记录_Identify,下个月看原因。

 回到顶部
总数 21 1 2 3 下一页