以文本方式查看主题

-  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编辑过]