Foxtable(狐表)用户栏目专家坐堂 → [求助]对后台表进行计算并写入窗口中表的最有效率方式


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

主题:[求助]对后台表进行计算并写入窗口中表的最有效率方式

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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
[求助]对后台表进行计算并写入窗口中表的最有效率方式  发帖心情 Post By:2021/8/10 13:14:00 [只看该作者]

SQL数据库,后台有张表,不可更改此表任何数据,希望将此表数据按条件提取出来,进行一些计算,然后写入窗口中的talbe中,请问老师应该如何做才最有效率,后台这张表数据很多,我现在将其全部用fill方法窗口中再计算显然效率太差了。
[此贴子已经被作者于2021/8/10 13:14:26编辑过]

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


加好友 发短信
等级:狐精 帖子:3202 积分:21279 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By:2021/8/10 13:17:00 [只看该作者]

SQLCommand试试

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


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

fill方法也可以加条件呀。或者使用SQLquery,进行分页加载

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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By: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

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


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

1、给起始时间加上索引
2、如果数据还是多,在加条件减少数据量

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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2021/8/10 13:54:00 [只看该作者]

加上索引?没接触过啊

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


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


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


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2021/8/10 14:04:00 [只看该作者]

上面代码中,在后面加入 dt.save,这样会改变工序合并表中的记录吗?
[此贴子已经被作者于2021/8/10 14:06:14编辑过]

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


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

不会

示例五

ExecuteReader有一个可选参数,如果设置为True,那么生成的DataTable不仅可以增加、删除和修改数据,还可以保存。
新建一个文件,在命令窗口测试下面的代码,会在A的第一行的第一列写入123,并删除第二行:

Dim cmd As new SQLCommand
cmd
.ConnectionName = "数据源名称"
Dim
 dt As DataTable
cmd
.CommandText = "Select * From {表A}"
dt
 = cmd.ExecuteReader(True'记得将参数设置为True
dt
.DataRows(0)("第一列") = 123
dt
.DataRows(1).Delete()
dt
.Save()
DataTables
("表A").Load() '重新加载表A,看看值是否已经变化


 回到顶部