以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]项目中数据多了,用了6年多的代码导致死机了 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=170154) |
-- 作者:huangfanzi -- 发布时间:2021/7/14 9:18:00 -- [求助]项目中数据多了,用了6年多的代码导致死机了 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年使用,生产流程卡表数据越来越多,今天打开此表,在加载树上选择数据时,死机了,分析了下原因并做了测试,就是红字部分导致的,老师,能帮我优化下此代码吗?
|
-- 作者:有点蓝 -- 发布时间:2021/7/14 9:21:00 -- 改为下拉窗口:http://www.foxtable.com/webhelp/topics/2116.htm 下拉窗口表可以通过条件和分页减少一次性显示的数据
|
-- 作者:cd_tdh -- 发布时间:2021/7/14 16:18:00 -- 改用临时表,生成临时表时,先去重复,然后用GetComboListString试试 |
-- 作者:chnfo -- 发布时间: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编辑过]
|