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


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

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

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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
直接用sql语句代替ft默认保存出现的问题?  发帖心情 Post By:2017/3/24 20:24:00 [显示全部帖子]

想提高效率直接用下面的代码保存新增行,
Dim t As System.Data.DataTable = tb.DataTable.BaseTable
'获取新增行数
Dim t1 As System.Data.DataTable = t.GetChanges(System.Data.DataRowState.Added )   '新增行
If t1 IsNot Nothing Then
    For Each dr As object In t1.Rows
        Dim str1 As String = ""
        Dim str2 As String = ""
        For Each dc As object In t1.Columns
            If dr(dc).Tostring  > "" Then
                str1 & = dc.ColumnName & ","
                str2 & = "'" & dr(dc.ColumnName) & "',"
            End If
        Next
        Dim strsql As String = "insert into " & tb.name & "(" & str1.trim(",") & ") Values('" &  str2.trim(",") & ")"
        Output.Show(strsql)
    Next
End If

输出的sql语句为:
insert into 采购单_主表(_Identify,_Locked,_SortKey,类别,供应商,采购日期,采购员,币别,采购单号,sys_Fbh,sys_Fzt,sys_Inputer,sys_Edate,sys_Mdate,sys_Dept,System_Sort_Temporary,System_Filter_TemporaryValues(''0','False','1','生产采购','宝源昌','2017-03-24','开发者','RMB','CG1703-001','1','待处理','开发者','2017-03-24 19:36:59','2017-03-24 19:36:59','MIS','0','1')
有两个问题
1 这种方式真的会比foxtable默认的保存方式快很多吗,当一次插入或修改多行保存时?
2 sql的数据库,不想区分数字,日期或者字符,都是用单引号括起来,在sql数据库中保存应该不影响吧?
3 可能是最大的问题,ft默认的三个系统列我要怎么赋值,是不是直接过滤掉就行(_identify后台数据库是自增可以不用,_Locked没有用,但有用_SortKey排序,要怎么赋值呢?
  还有后面会多出两列System_Sort_Temporary,System_Filter_Temporary,这个是怎么回事,直接按这两个名称过过滤吗,因为是通用的代码?

谢谢!





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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/3/25 17:43:00 [显示全部帖子]

还有个问题想请教下:
如果插入了多行,而且每行的字段数量不一致,比如
第一行是 "insert into 表A(编号,姓名) values('001','张三')"
第二行是 "insert into 表A(编号,姓名,地址) values('001','张三','李家庄四号')"  '因为地址不是必填字段,有的行可能填写,有的行没有
这种情况下怎么提高效率?

还是说不管有没有录入字段,都用
insert into 表A(这里将表中的所有字段都填写上)  se lect 所有字段的值,没有就用空的代替可以用union全部拼在起 from 表A

哪种效率更高?  还有insert into 表A 后面跟的字段多少影响效率吗?
谢谢!





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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/3/28 15:39:00 [显示全部帖子]

还有个问题,直接用sql语句保存以后,原来表中因为修改过的行左边那个行号变为橘色的,sql保存后这个颜色变不回来了,要怎么办?

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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/3/29 22:55:00 [显示全部帖子]

又有一个新的问题,如下面的事务处理函数

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

如果当中有一条语句因为少了括号或者其他语法出错导致程序执行中止,但前面已经执行的语句就不能回滚了,
是不是事务中任务一条执行不成功全部回滚是指必须没有语法错误的情况下,突然停电应该会回滚吧?

如果因为其中任何一条语法错误就全部回滚可以吗?要怎么写代码?

谢谢!





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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望: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语法正确的情况下都会同时提交或回滚就行.因为现在项目全部改为这种方式保存,要确定可行才修改,不然工作量太大,改完后才发现此路不通就晚了.



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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望: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 事件中执行测试看下?
真的没懂.


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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望: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

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


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


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望: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
总算可以了,谢谢有点色老师!


 回到顶部