以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  fill的问题继续  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=80138)

--  作者:hdffzxf
--  发布时间:2016/1/17 5:19:00
--  fill的问题继续
窗口table为了提高数据的响应速度,对比了fill的直接加载和动态生成talbe,再用datasource 绑定到窗口,这两个方法fill还是要快很多:
t.Fill("Sel ect * Fr om {" & 表名 & "} wh ere sys_审计项目编号=\'" & 全局变量审计项目编号 & "\'",全局变量当前模板数据源,True)
但是目前有个小问题,fill的IsQuery参数设置为true后,有时在新增行时,行不是增加在最末,竟然插进了行中间,不管是用回车自动增行还是用addnew命令都不行,这个问题怎么解决?注IsQuery参数设置为true要比设为false速度要快不少,所以用true参数。


--  作者:大红袍
--  发布时间:2016/1/17 10:33:00
--  

不可能的事情。请做例子发上来测试。


--  作者:hdffzxf
--  发布时间:2016/1/17 13:16:00
--  
这个系统比较大,不好做例子,大红袍老师可否远程帮看一下,的确是有这样的问题
--  作者:大红袍
--  发布时间:2016/1/17 16:33:00
--  
不会有这种问题,如果出现,肯定是_Sortkey或者设置了排序列。
--  作者:hdffzxf
--  发布时间:2016/1/17 16:50:00
--  
排序列没有设置,我估计确实是_sortkey的问题,_sortkey都是程序在干预,我在保存数据时干预,确保它跟行号一致,这样在我从后台需要加载或计算某行数据的时候,可以准确定位到,这个跟增行时有什么冲突吗?
--  作者:hdffzxf
--  发布时间:2016/1/17 16:55:00
--  
另外,从外部表fill到窗口表的文本型列,好象无法判断出哪些列是字符型(255以下),哪些列是备注型(无限字符)?用MaxLength返回的都是-1,怎么办?
发现原因了,是fill的IsQuery的问题,设置为false,增列和判断列类型都 没有问题,设置为true就会增行乱次序和无法判断字符型和备注型。但是设为false有个最大问题,加载的时候要比true要慢不少,我要纠结的取舍吗?我由datasourse绑定改为fill就是为了提高加载的速度呀!
[此贴子已经被作者于2016/1/17 17:08:56编辑过]

--  作者:大红袍
--  发布时间:2016/1/17 20:09:00
--  
你msgbox看一下_Sortkey就行,默认是根据它的大小排序的。
--  作者:大红袍
--  发布时间:2016/1/17 20:13:00
--  

6楼的,没办法。dataSource不会比fill慢,如果慢,就是你其它代码影响了。做例子上来测试。


--  作者:hdffzxf
--  发布时间:2016/1/17 23:52:00
--  
原来是用动态生成datatable的办法,如下面的代码:
        Dim q As new OuterTableBuilder
        q.TableName = 表名
        q.TableCaption = 表名
        q.ConnectionName = 数据源
        q.SelectString = "Se lect * Fr om [" & 表名 & "] "
        q.Build

生成datatable后,再用datasource绑定到窗口table,绑定的过程很快,但是生成datatable的过程明显有卡顿,所以后来探索其他的动态加载手段,发现用sql语句直接fill,速度要快很多,所以才改成了fill。

现在找到了为什么行会出现在上方的原因,确实因为是sortkey的问题,之前我用如下代码干预sortkey:
                If dt.basetable.Columns.contains("_SortKey") Then
                    Dim drs As List(of DataRow) = dt.Select("","[_SortKey]")
                    For i As Integer = 0 To drs.Count - 1
                        If  drs(i).BaseRow("_SortKey") <> i+1 Then
                            drs(i).BaseRow("_SortKey") = i+1
                        End If
                    Next
                End If

现在我才发现  drs(i).BaseRow("_SortKey") = i+1这句对新增行干预无效,合成的sql语句无法保存新增行的sortkey 至服务器上,求解决方案!

--  作者:hdffzxf
--  发布时间:2016/1/18 0:13:00
--  
我猜应该是这个底层的BaseRow用fill加载过去的时候,是只读的吧?为什么干预不了呢?