以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]对后台表进行计算并写入窗口中表的最有效率方式 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=170881) |
-- 作者:huangfanzi -- 发布时间:2021/8/10 13:14:00 -- [求助]对后台表进行计算并写入窗口中表的最有效率方式 SQL数据库,后台有张表,不可更改此表任何数据,希望将此表数据按条件提取出来,进行一些计算,然后写入窗口中的talbe中,请问老师应该如何做才最有效率,后台这张表数据很多,我现在将其全部用fill方法窗口中再计算显然效率太差了。 [此贴子已经被作者于2021/8/10 13:14:26编辑过]
|
-- 作者:cd_tdh -- 发布时间:2021/8/10 13:17:00 -- 用SQLCommand试试 |
-- 作者:有点蓝 -- 发布时间:2021/8/10 13:39:00 -- fill方法也可以加条件呀。或者使用SQLquery,进行分页加载 |
-- 作者:huangfanzi -- 发布时间:2021/8/10 13:45:00 -- 以下代码红字部分非常耗时,有好的办法吗? Dim dtp As WinForm.DateTimePicker = e.Form.Controls("DateTimePicker_截止日期") Dim tb As WinForm.Table = e.Form.Controls("Table1") Dim t As Table = tb.Table Dim dt As DataTable If dtp.Value = Nothing Then MessageBox.Show("请选选择截止日期!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information) Else Dim cmd_工序表 As New SQLCommand cmd_工序表.C cmd_工序表.C ommandText = "S elect * From {工序合并表} Where 起始时间 < \'" & dtp.Value.AddDays(1) & " \'" dt = cmd_工序表.ExecuteReader() Forms("进度条独立窗口").Show \'打开进度条独立窗口 Dim p As WinForm.ProgressBar \'定义进度条 Dim Lab1 As WinForm.Label p = Forms("进度条独立窗口").Controls("ProgressBar") Lab1 = Forms("进度条独立窗口").Controls("Label1") Lab1.Text = "正在加载截止日期前的工序合并表全部数据..." Application.DoEvents() \'即刻暂停代码的执行,重新绘制控件后,继续执行代码. Dim t1 As Date = Date.Now Dim drs As List(Of DataRow) = dt.Select("", "卷号,起始时间") \'指定母卷号计算 If drs.Count=1 Then drs(0)("库存标记") = True Else For i As Integer = 1 To drs.Count - 1 p.Maximum = drs.Count \'设置最大值 p.Minimum = 0 \'设置最小值 If i Mod 100 = 0 Then \'每运算100条更新一次进度条 p.Value = i \'当前值为已经完成的行数 Lab1.Text = "工序合并表加载完成,开始计算..." & i + 1 & " / " & drs.Count Application.DoEvents() \'即刻暂停代码的执行,重新绘制控件后,继续执行代码 ElseIf i=drs.Count-1 \'当i为最大值减1时 p.Value = drs.Count \'当前值直接等于最大值 Lab1.Text = "完成全表库存标记计算,正在保存数据..." & i + 1 & " / " & drs.Count Application.DoEvents() \'即刻暂停代码的执行,重新绘制控件后,继续执行代码 End If If drs(i)("卷号").Contains(drs(i-1)("卷号")) Then drs(i-1)("库存标记") = False Else drs(i-1)("库存标记") = True End If Next drs(drs.Count-1)("库存标记") = True End If Forms("进度条独立窗口").Close MessageBox.Show("完成全表库存计算!耗时: " & (Date.Now - t1).TotalSeconds & "秒,请不要频繁操作.", "提示",MessageBoxButtons.ok, MessageBoxIcon.Information) t.DataSource = dt End If
|
-- 作者:有点蓝 -- 发布时间:2021/8/10 13:51:00 -- 1、给起始时间加上索引 2、如果数据还是多,在加条件减少数据量
|
-- 作者:huangfanzi -- 发布时间:2021/8/10 13:54:00 -- 加上索引?没接触过啊 |
-- 作者:有点蓝 -- 发布时间:2021/8/10 13:56:00 -- 学呗,https://www.baidu.com/baidu?word=SqlServer+%E7%B4%A2%E5%BC%95 |
-- 作者:huangfanzi -- 发布时间:2021/8/10 14:04:00 -- 上面代码中,在后面加入 dt.save,这样会改变工序合并表中的记录吗? [此贴子已经被作者于2021/8/10 14:06:14编辑过]
|
-- 作者:有点蓝 -- 发布时间:2021/8/10 14:11:00 -- 不会 示例五 ExecuteReader有一个可选参数,如果设置为True,那么生成的DataTable不仅可以增加、删除和修改数据,还可以保存。 Dim cmd As new SQLCommand |