以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  事务处理不一致的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=60122)

--  作者:zpx_2012
--  发布时间: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的情况?

谢谢!


--  作者:有点甜
--  发布时间:2014/11/18 19:14:00
--  
 例子发上来,代码不应该有你这种情况。
--  作者:有点甜
--  发布时间:2014/11/18 19:15:00
--  
 再有一个,在save之前 _Identify 不是真实的 _Identify,保存之后,才会生成真正的,但不应该有0的出现。
--  作者:zpx_2012
--  发布时间:2014/11/18 19:18:00
--  
每个月偶尔会出现一两次这样的情况,所以做的例子也很难重现,
那"_Identify"的值什么情况下会为0呢?

--  作者:有点甜
--  发布时间:2014/11/18 19:24:00
--  

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

 

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


--  作者:逛逛
--  发布时间:2014/11/18 19:42:00
--  

_Identify 为什么为0 俺不知道

 

但你的事务用法好像不妥

 

 

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


--  作者:zpx_2012
--  发布时间: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
来统一执行所有的事务,这样不对吗?
因为偶尔会有些单据行莫明其妙的丢失掉,这个问题困扰很久但一直找不到原因,请帮忙指点一下。谢谢!

--  作者:有点甜
--  发布时间:2014/11/18 20:08:00
--  

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


--  作者:zpx_2012
--  发布时间:2014/11/18 20:10:00
--  
甜老师,但合成的语句中都没有这些特殊字符啊
--  作者:有点甜
--  发布时间:2014/11/18 20:16:00
--  
 那你记录一些其他其它信息,不要单独记录_Identify,下个月看原因。