Foxtable(狐表)用户栏目专家坐堂 → [求助]项目中数据多了,用了6年多的代码导致死机了


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

主题:[求助]项目中数据多了,用了6年多的代码导致死机了

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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
[求助]项目中数据多了,用了6年多的代码导致死机了  发帖心情 Post By:2021/7/14 9:18:00 [只看该作者]


Initialize项目事件
Dim cmd_生产计划 As New SQLCommand
cmd_生产计划.C
cmd_生产计划.CommandText = "S elect * From {生产计划} Where [_Identify] Is Null"
_dt生产计划 = cmd_生产计划.ExecuteReader()

PrepareEdit 生产流程卡表事件
'生成下拉
If e.IsFocusCell Then
    Select Case e.Col.Name
        Case "生产计划主号"
            e.Col.Combolist = _dt生产计划.SQLGetComboListString("生产计划主号","[项目状态] = '执行中' And [生产计划主号] not In ('" &  e.Table.DataTable.SQLGetComboListString("生产计划主号").Replace("|", "','") & "')")
    End Select
End If

经过6年使用,生产流程卡表数据越来越多,今天打开此表,在加载树上选择数据时,死机了,分析了下原因并做了测试,就是红字部分导致的,老师,能帮我优化下此代码吗?

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107880 积分:548763 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/14 9:21:00 [只看该作者]

改为下拉窗口:http://www.foxtable.com/webhelp/topics/2116.htm

下拉窗口表可以通过条件和分页减少一次性显示的数据

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


加好友 发短信
等级:狐精 帖子:3106 积分:20733 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By:2021/7/14 16:18:00 [只看该作者]

改用临时表,生成临时表时,先去重复,然后用GetComboListString试试

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


加好友 发短信
等级:九尾狐 帖子:2223 积分:18276 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/14 17:22:00 [只看该作者]

不一定是这个问题。not in 本身效率就很低,如果数据很多的时候,有可能是执行的字符串太长导致的,就算是SQL语句,不论是in或not in 都执行不了。
可以考虑用一个查询表,再从这个表中遍历形成一个集合X,然后再string.join("|",x.toarray),把它赋给下拉框

个人认为就是not in的执行效率太低了。因为后面获取的字符串太长,not in的判断超时

可以考虑试一下这个:

设一个全局变量Z,maintablechanged事件中,如果切换到的新表是datatables("生产流程卡")时

dim dtscjh as datatable = datatables("生产计划")
dim dtsclc as datatable = datatables("生产流程卡")

dim hsx as new hashset(of string)
for each dr as datarow in dtsclc.sqlselect("项目状态 = '执行中'")
hsx.add(dr("生产计划主号"))
next

dim lsty as new list(of string)
for each dr as datarow in dtscjh.sqlselect("项目状态 = '执行中'")
if hsx.contains(dr("生产计划主号")) = false then 
lsty.add(dr("生产计划主号"))
end if 
next

Z = string.join("|",lsty.toarray())

提示一下:不论是SQLGetComboListString还是GetComboListString,数据量大的时候,效率远远低于遍历


然后在表的perpareedit事件中
if e.col.name = "生产计划主号" then 

e.table.Cols("生产计划主号").ComboList = Z

end if 

[此贴子已经被作者于2021/7/14 17:40:50编辑过]

 回到顶部