Foxtable(狐表)用户栏目专家坐堂 → 添加5000条记录耗时运行13分钟,本代码正常吗?


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

主题:添加5000条记录耗时运行13分钟,本代码正常吗?

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


加好友 发短信
等级:幼狐 帖子:177 积分:2156 威望:0 精华:0 注册:2012/5/29 15:35:00
添加5000条记录耗时运行13分钟,本代码正常吗?  发帖心情 Post By:2025/3/28 11:28:00 [只看该作者]

For Each cc As String In Split(lst.Value, ",")
    cmd.CommandText = "SEL ECT * F rom {图定列车} where 车次= '" & cc & "'"
    dt = cmd.ExecuteReader()
    
    ' 遍历日期范围
    For j As Integer = 0 To ts.Days - 1
        Dim currentDate As Date = sd.Value.AddDays(j)
          ' 添加新记录
        For Each dr1 As DataRow In dt.DataRows
            Try
                Dim dr2 As DataRow = DataTables("列车计划").AddNew()
                For i As Integer = 0 To Cols1.Length - 1
                    dr2(Cols2(i)) = dr1(Cols1(i))
                Next
                dr2("日期") = currentDate
                dr2("序号") = dr1("序号") ' 将图定列车的序号赋值给列车计划的序号
                dr2("停开") = "开行"
                dr2.Save()
            Catch ex As Exception
                MessageBox.Show("添加记录时发生错误: " & ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return
            End Try
        Next
        
        ' 更新进度条
        p.Value += 1
        Application.DoEvents() ' 刷新界面
    Next
Next


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


加好友 发短信
等级:幼狐 帖子:177 积分:2156 威望:0 精华:0 注册:2012/5/29 15:35:00
  发帖心情 Post By:2025/3/28 12:13:00 [只看该作者]

找到问题了,多了一个save()

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


加好友 发短信
等级:超级版主 帖子:113133 积分:576082 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/3/28 12:14:00 [只看该作者]

这个耗时应该是正常的。假设是lst集合有5000个,ts.Days不知道有几天,再乘于5000就不止5000条记录了

1、cmd会执行5000次,后台查询一向都费时间
2、dr2.Save()会保存【lst.count * ts.Days】次。考虑去掉这一句,到最后直接保存一次DataTables("列车计划").save即可
3、更新进度条的Application.DoEvents()操作会导致程序处理变慢,大概会慢10倍以上

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


加好友 发短信
等级:幼狐 帖子:177 积分:2156 威望:0 精华:0 注册:2012/5/29 15:35:00
  发帖心情 Post By:2025/3/28 12:24:00 [只看该作者]

好的,明白,我再改进一下代码,谢谢

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


加好友 发短信
等级:五尾狐 帖子:1059 积分:9171 威望:0 精华:0 注册:2015/8/12 16:28:00
  发帖心情 Post By:2025/3/28 12:45:00 [只看该作者]

 cmd.CommandText = "SEL ECT * F rom {图定列车} where 车次= '" & cc & "'"   这里改成 IN。
这样查询1次,存在临时建立的datatable里面。后面再从这个临时的datatable里面查询。

两个FOR连用,是灾难,要避免。

application.do events  不用每次就进行,如果一定要刷新,可以在第一层for 里面刷新。

在for里面save,服务器吃不消。

 回到顶部