以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  逛逛的事务处理用于sql 2005出现错误  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=48056)

--  作者:scott518
--  发布时间:2014/3/22 10:16:00
--  逛逛的事务处理用于sql 2005出现错误

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

 


图片点击可在新窗口打开查看此主题相关图片如下:截图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


--  作者:逛逛
--  发布时间:2014/3/22 13:19:00
--  

sql2005我到没有试过

 

问一个问题

 

msgbox(sql) \'到这里显示的update语句均正确

 

你返回的sql,不用事务的话,可以执行吗?


--  作者:zpx_2012
--  发布时间:2014/3/22 16:28:00
--  
可能是两者语法不一样吧
[此贴子已经被作者于2014-3-22 16:29:21编辑过]

--  作者:逛逛
--  发布时间:2014/3/22 16:37:00
--  

我已经检查过,函数在SQL2005中没有问题,

 

 


--  作者:scott518
--  发布时间: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


--  作者:逛逛
--  发布时间:2014/3/22 16:46:00
--  
以下是引用scott518在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
--  发布时间: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

--  作者:逛逛
--  发布时间:2014/3/22 19:50:00
--  

把表名的大括号去掉。


--  作者:scott518
--  发布时间:2014/3/22 21:05:00
--  
谢谢逛逛,可以了,原来是SQL语句中不能有大括号。