以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  直接用sql语句代替ft默认保存出现的问题?  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=98145)

--  作者:happyft
--  发布时间:2017/3/24 20:24:00
--  直接用sql语句代替ft默认保存出现的问题?
想提高效率直接用下面的代码保存新增行,
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,这个是怎么回事,直接按这两个名称过过滤吗,因为是通用的代码?

谢谢!





--  作者:有点蓝
--  发布时间:2017/3/24 21:02:00
--  
1、一提交多条插入语句确实比Foxtable一条条保存来的快

2、建议还是严格区分类型,用户可以懒,开发人员不能懒

3、取数据库_SortKey的最大值+1

System_Sort_Temporary,System_Filter_Temporary不用管,数据库不会有这2列的,项目里才会有

--  作者:HappyFt
--  发布时间: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 后面跟的字段多少影响效率吗?
谢谢!





--  作者:有点色
--  发布时间:2017/3/26 11:48:00
--  

 效率快慢是测试出来的。你试试不就知道了?如果你想控制,为空的,你可以不赋值。


--  作者:HappyFt
--  发布时间:2017/3/28 15:39:00
--  
还有个问题,直接用sql语句保存以后,原来表中因为修改过的行左边那个行号变为橘色的,sql保存后这个颜色变不回来了,要怎么办?
--  作者:有点色
--  发布时间:2017/3/28 16:49:00
--  
以下是引用HappyFt在2017/3/28 15:39:00的发言:
还有个问题,直接用sql语句保存以后,原来表中因为修改过的行左边那个行号变为橘色的,sql保存后这个颜色变不回来了,要怎么办?

 

参考

 

http://www.foxtable.com/webhelp/scr/1538.htm

 

http://www.foxtable.com/webhelp/scr/2365.htm

 


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

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

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

谢谢!





--  作者:有点蓝
--  发布时间:2017/3/30 10:29:00
--  
如果catch到就会回滚的,msgbox(ex.tostring)   有没有弹出提示?

停电不会影响事务的处理,还没有提交停电后也不会提交

--  作者:有点色
--  发布时间:2017/3/30 11:17:00
--  
 7楼的代码,本身就是一次性提交的,没有你说的不能回滚的情况。
--  作者:有点色
--  发布时间:2017/3/30 11:19:00
--  

 如果过程中有foxtable自己的错误,你可以在 BeforeShowErrorMessage 事件写回滚代码

 

http://www.foxtable.com/webhelp/scr/2655.htm