Foxtable(狐表)用户栏目专家坐堂 → 直接用sql语句代替ft默认保存出现的问题?


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

主题:直接用sql语句代替ft默认保存出现的问题?

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


加好友 发短信
等级:八尾狐 帖子:1905 积分:16921 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/3/30 18:37:00 [只看该作者]

不知道怎么用这个BeforeShowErrorMessage 事件,把我的事务函数放在里面吗?因为出错的地方都是函数,都不知道是哪个事件产生的?

我后来检查了问题出现的原因,是因为每个sql语句都是通过拼接的strsql加入到集合中去的如:sqlList.Add(strsql),最后才在事务函数中一个一个执行,
其中有一个拼接语句返回值为空,当时少了一个判断,等于传递一个空值到事务中去执行结果就出错了,但上面那个函数仍然返回执行OK,而且前面已经执行了两个删除的sql语句,再打开表单看时数据确实被删除了,所以说明出错前的语句都成功提交了,我才有此问。

当然这种错误发现后就可以修正,以后就没有,就是想确认下只要用上面的事务函数,不管多少个sql语句在ft语法正确的情况下都会同时提交或回滚就行.因为现在项目全部改为这种方式保存,要确定可行才修改,不然工作量太大,改完后才发现此路不通就晚了.



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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/3/30 19:23:00 [只看该作者]

如果没有执行 catch 的语句

 

Catch ex As Exception
    Connections(Mydata).Rollback()  '回滚事务
    msgbox(ex.tostring)      '返回错误信息
    sqlList.Clear()  '清空集合
    Return "NG"
End Try
 
那就说明,没有检测到错误。foxtable有可能吞掉了错误,放在 BeforeShowErrorMessage 事件处理了,你加入msgbox看是否弹出。

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


加好友 发短信
等级:八尾狐 帖子:1905 积分:16921 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/3/30 19:49:00 [只看该作者]

没明白,怎么放?

保存按钮代码如下:
If Functions.Execute("tp_SQL",sqlList) = "OK" Then  '执行事务保存
         msgbox("保存成功")
End If

事务处理函数tp_SQL就是上面那个,把哪段代码放在BeforeShowErrorMessage 事件?
还是说像事务函数那样的写法直接写几个sql事务语句在BeforeShowErrorMessage 事件中执行测试看下?
真的没懂.


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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/3/30 19:52:00 [只看该作者]

在事件加入msgbox,看你报错的时候有没有弹出。如果弹出了,你就在那里写事务回滚的代码。


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


加好友 发短信
等级:八尾狐 帖子:1905 积分:16921 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/3/30 20:16:00 [只看该作者]

测试了,帮意将一sql语句置为空,,,BeforeShowErrorMessage 事件确实会弹出错误,那回滚的代码怎么写啊?
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
把上面整个函数都放在BeforeShowErrorMessage 事件,还是只放下面这句
Catch ex As Exception
    Connections(Mydata).Rollback()  '回滚事务
    msgbox(ex.tostring)      '返回错误信息
    sqlList.Clear()  '清空集合
    Return "NG"
End Try

半句应该不知道回滚哪些吧,请老师指点下,真不知这个回滚代码要怎么写,才能实现?
谢谢!


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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/3/30 20:25:00 [只看该作者]

这样写,细节自己调整

 

msgbox(e.ex.Gettype.Name)      '返回错误信息
If e.ex.Gettype.name = "OleDbException" Then

    msgbox(123)
    Connections(Mydata).Rollback()  '回滚事务
    vars("返回值") = "NG"
    e.Cancel = true
end if


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


加好友 发短信
等级:八尾狐 帖子:1905 积分:16921 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/3/30 22:54:00 [只看该作者]

反复试了下,只是错误判断不知道会有多少种,就不去判断了,只要出错就回滚,但回滚也没用,原来事务函数中的语句也同样会提交,最后在事务函数中加了个判断才可以.如下:
 For Each sql As String In SqlList
        cmd.CommandText = sql
        cmd.ExecuteNonQuery()
    Next
 if vars("返回值") = "NG" then 
    Connections(Mydata).Rollback()  '回滚事务
else
  Connections(Mydata).Commit()  '提交事务
    sqlList.Clear()  '清空集合
    Return "OK"
end if
总算可以了,谢谢有点色老师!


 回到顶部
总数 17 上一页 1 2