Mysql 更快地填充列表框
有没有办法使填充Mysql 更快地填充列表框,mysql,vb.net,Mysql,Vb.net,有没有办法使填充列表框更快,因为在填充列表框时,UI在表单加载时会冻结 这是我的表单加载代码: Dim abc As String=itemCount() Dim输出=账户获取(a) 对于输出中的每个s ListBox1.Items.Add(s) count1+=1 如果count1=abc,则 ListBox1.Visible=True 如果结束 下一个 这是模块中的查询: Public Function Account\u Get(ByVal chk作为字符串)作为列表(字符串) Dim结
列表框
更快,因为在填充列表框
时,UI在表单加载时会冻结
这是我的表单加载代码:
Dim abc As String=itemCount()
Dim输出=账户获取(a)
对于输出中的每个s
ListBox1.Items.Add(s)
count1+=1
如果count1=abc,则
ListBox1.Visible=True
如果结束
下一个
这是模块中的查询:
Public Function Account\u Get(ByVal chk作为字符串)作为列表(字符串)
Dim结果=新列表(字符串)()
尝试
cn.Open()
sql=“从表中选择列名称作为str,其中status='New'order by rand()
cmd=新的MySqlCommand(sql,cn)
dr=cmd.ExecuteReader
当雷德博士
result.Add(dr(“str”).ToString())
结束时
返回结果
特例
MsgErr(例如消息“遇到错误”)
一无所获
最后
cn.Close()
结束尝试
端函数
这很好用。但事实是它加载了太多的数据。用户界面在加载时冻结。希望有人能帮我。谢谢 您使用的查询包含随机顺序。在MySQL中,随机排序记录可能是一个巨大的性能问题,因为它必须遍历表中的所有记录,然后随机排序。表中记录越多,性能损失越大。查询中的记录数也没有限制。因此,如果表中有数千项,列表框的大小也将有数千项,这可能需要很长时间 如果你真的需要随机排序,你可以在你的代码中做一些事情。我现在假设您是:1)在表中使用标识符,2)您实际上希望限制列表框中的项目数量,而不是显示所有项目
希望这能帮助您找到解决方案因为您正在递增count1,我假设它是某种数字。但是,然后将其与If语句中的字符串进行比较。请使用选项严格 将函数更改为返回字符串数组。从sql语句中获取随机排序,并将其移动到函数末尾的一个小linq 您可以在数据检索和显示部分添加秒表,以查看瓶颈所在。列表框上的BeginUpdate和EndUpdate可防止每次添加时重新绘制
Private Sub Form1\u Load(发送方作为对象,e作为事件参数)处理MyBase.Load
Dim output=Account\u Get()
ListBox2.BeginUpdate()
ListBox2.Items.AddRange(输出)
ListBox2.EndUpdate()
端接头
作为新随机变量的私有Rand
公共函数Account_Get()作为字符串()
Dim dt作为新数据表
将结果设置为字符串()
将cn用作新的MySqlConnection(“您的连接字符串”)
Dim Sql=“从状态为'New''的表中选择列名称作为str,按rand()排序”
使用cmd=newmysqlcommand(Sql,cn)
尝试
cn.Open()
dt.Load(命令执行器读取程序)
特例
MessageBox.Show(例如消息“遇到错误”)
一无所获
结束尝试
终端使用
终端使用
结果=(来自dt.AsEnumerable()中的dRow)
Let field=dRow(“str”).ToString
兰德订购,下一个
选择字段)
返回结果
端函数
为了将来的参考,请在提交之前查看问题的预览,如果问题一团糟,请不要提交。创建一个数据表
,调用其加载
方法,并传递数据读取器将查询结果集加载到数据表
。设置列表框的显示成员
>对于要显示的列的名称,然后将DataTable
分配给DataSource
属性。@jmcilhinney为什么不回答而不是注释?@DanielE.,因为在我看来,我发布的内容不够完整,不能作为答案。注释说明了应该做什么,但实际上没有做什么,而答案应该可以。我没有发布这样的答案,因为我想让OP调动他们的大脑,为他们自己编写代码。然后他们可以根据这些代码回答自己的问题。不要在UI线程上做工作,开始一个新的线程,创建一个任务等等。有很多改进是可以做的,并且是离题的,一个,如果需要的话toAccount\u Get
不返回任何内容,那么调用方将轰炸输出中的每一个s;,特别是这一行,因为它什么都不是……我知道如何限制。我需要加载所有数据,这就是我在查询中没有使用限制的原因。顺便问一下,为什么这一行选择str)。ToArray给我一个错误。很抱歉,我更改了一个few变量名称在最后一分钟。它应该是选择字段)。ToArray
我已经更正了答案中的代码。顺便说一句,我用大约1500条记录的表进行了测试,它填充了列表框,并在眨眼之间加载了表单。只有我的测试是在SQL Server和本地db上进行的。我尝试了你的代码,现在加载速度更快,但仍然是ui freeze仍然存在。可能是因为我加载了近百万条记录。仅供参考,我之所以加载如此大的数据是因为我将使用它进行抽奖。再次感谢!哇!一个用户怎么可能与一个有一百万条记录的列表框交互。你一定有一台内存丰富的计算机。