Foxtable(狐表)用户栏目专家坐堂 → 逛逛的事务处理用于sql 2005出现错误


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

主题:逛逛的事务处理用于sql 2005出现错误

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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
逛逛的事务处理用于sql 2005出现错误  发帖心情 Post By:2014/3/22 10:16:00 [显示全部帖子]

想试用逛逛的事务处理方式,在执行函数时出现下述错误,请教是什么意思及原因,谢谢!

 


图片点击可在新窗口打开查看此主题相关图片如下:截图20140322100509.jpg
图片点击可在新窗口打开查看

'获取数据库连接
Dim SqlList As List(of String) = Args(0)
Dim flt,flt2 As String
flt = Args(1)
flt2 = Args(2)
Dim V As Double = Args(3)
Dim cn1 As Connection = Connections("ABC")   '获取数据源名称
Dim cn As New System.Data.OleDb.OleDbConnection(cn1.ConnectionString)
Dim cmd As new System.Data.OleDb.OleDbCommand
cn.Open()
cmd.Connection = cn
try
    cmd.Transaction = cn.BeginTransaction()   '开始事务
    For Each sql As String In SqlList
        msgbox(sql) '到这里显示的update语句均正确
        cmd.CommandText = sql  '执行到此出现上述的错误提示
        cmd.ExecuteNonQuery()
    Next
    cmd.Transaction.Commit()  '提交事务
    cmd.Dispose()    '释放
    cn.Close()       '关闭连接
    Return "OK"
Catch ex As Exception
    cmd.Transaction.Rollback()  '回滚事务
    ' msgbox("操作被取消!")      '返回错误信息
    msgbox(ex.tostring)      '返回错误信息
    cmd.Dispose()    '释放
    cn.Close()       '关闭连接
    Return "NG"      '返回值可以用于后续操作
End Try


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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/3/22 16:43:00 [显示全部帖子]

下面蓝色部份是直接写在保存前的事件代码中可以执行,但就是遇到异常错误后多个update语句可以只更新了一个,没有事务的功能,有些数据可能会丢失,更新就不准确了。如果不用蓝色的,而用红色的调用上面1楼中的函数来执行,实现事务的功能就出现那个错误的提示了。

try
    '---更新累计数量
    cmd.CommandText = "Update {生产物料明细} Set 已领用量 = 已领用量 + " & V & " where " & flt
    cmd.ExecuteNonQuery()
    '---更新库存表数量
    If edr.IsNull("工序号") Then
        flt2 = "仓库 = '" & pr("仓库") & "' and 产品编码 =  '" & edr("产品编码") & "'"
    Else
        flt2 = "仓库 = '" & pr("仓库") & "' and 产品编码 =  '" & edr("产品编码") & "' And 工序号 = " & edr("工序号")
    End If
    cmd.CommandText = "Update {库存表} Set 合格数量 = 合格数量 - " & V & " where " & flt2
    cmd.ExecuteNonQuery()
Catch ex As Exception
    msgbox(ex.tostring)  '返回错误信息
    e.Cancel = True
End Try

Dim SQLLIST As New List(OF String)
'---更新累计数量
str = "Update {生产物料明细} Set 已领用量 = 已领用量 + " & V & " where " & flt
SQLLIST.Add(str)
'---更新库存表数量
If edr.IsNull("工序号") Then
    flt2 = "仓库 = '" & pr("仓库") & "' and 产品编码 =  '" & edr("产品编码") & "'"
Else
    flt2 = "仓库 = '" & pr("仓库") & "' and 产品编码 =  '" & edr("产品编码") & "' And 工序号 = " & edr("工序号")
End If
str = "Update {库存表} Set 合格数量 = 合格数量 - " & V & " where " & flt2
SQLLIST.Add(str)
If Functions.Execute("tp_SQL",SQLLIST,flt,flt2,V) = "NG" Then
    e.Cancel = True
End If


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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/3/22 18:04:00 [显示全部帖子]

谢谢逛逛,那些是用于传递update的参数用的,原来是没有,我以为是因为缺少条件所以出错,但是我去掉也测试过,一样的错误提示。是我哪里用错了吗?
实际上我就是在保存前的事件代码中用下述语句调用事务处理函数而已,是下面的事件代码错了,还是函数中不对。
Dim SQLLIST As New List(OF String)
'---更新累计数量
str = "Update {生产物料明细} Set 已领用量 = 已领用量 + " & V & " where " & flt
SQLLIST.Add(str)
'---更新库存表数量
If edr.IsNull("工序号") Then
    flt2 = "仓库 = '" & pr("仓库") & "' and 产品编码 =  '" & edr("产品编码") & "'"
Else
    flt2 = "仓库 = '" & pr("仓库") & "' and 产品编码 =  '" & edr("产品编码") & "' And 工序号 = " & edr("工序号")
End If
str = "Update {库存表} Set 合格数量 = 合格数量 - " & V & " where " & flt2
SQLLIST.Add(str)
If Functions.Execute("tp_SQL",) = "NG" Then  ‘调用事务处理函数
    e.Cancel = True
End If

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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/3/22 21:05:00 [显示全部帖子]

谢谢逛逛,可以了,原来是SQL语句中不能有大括号。

 回到顶部