| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 429 人关注过本帖, 1 人收藏
标题:怎么快速的往MDB中写大量数据
只看楼主 加入收藏
linandceline
Rank: 2
等 级:论坛游民
威 望:2
帖 子:79
专家分:47
注 册:2014-12-19
结帖率:80%
  已结贴   问题点数:20  回复次数:4   
怎么快速的往MDB中写大量数据
程序本身过程是这样的:
1、从EXCEL中导入到listview中
2、根据一些检测的规则,检查出一些不允许写入数据库的情况,检查的过程中利用数组记录了需要写入数据库的相关数据
3、检查完成后将数组中的数据写入数据库

程序运行是没有问题的,就是:慢

检查的过程不慢,我用进度条可以看到很快完成了检查的部分
但是到了写入的时候,很慢,出现假死
进度条也没有适时的进行更新

数据总数,32000多行,需写入时,最多11列,最少6列,下面代码中可以看到

我用写6列的情况试运行,写32000多行,直接让我失去耐性
然后试着写5000行,大概10分钟写入。

请教:
1、有没有更快的方式写入?
2、为什么循环中加入了doevents,进度条仍然不会更新呢?
3、假死状态有没有办法避免


代码如下:

For i = 1 To ww
    DoEvents
    yy = 70 * i / ww
    MDIForm1.ProgressBar1.Value = 30 + Int(yy)
    If Mlist(i) = False Then '当数据库还未有当前编码的记录时
      rs.Addnew
      If Mfnum(i) = "" Then '如果当前信息未录入文件代码时,看是否有负责人
        If nam(i) = "" Then '如果没有负责人,那么当旧编码直接导入
          rs("负责人") = ""
          rs("待处理人") = ""
          rs("待处理人帐号") = ""
          rs("发放状态") = "待发放"
          rs("物料编码") = Mnum(i)
          rs("物料名称") = Mnam(i)
        Else
          rs("负责人") = nam(i)
          rs("待处理人") = nam(i)
          rs("待处理人帐号") = Minch(i)
          rs("反馈状态") = "是"
          rs("物料编码") = Mnum(i)
          rs("物料名称") = Mnam(i)
          rs("发放状态") = "待发放"
          rs("任务类型") = "物料新增"
          rs("任务节点") = 1
          rs("反馈时间") = Now
          rs("反馈人") = Usnum
          MaddLo p, lv
        End If
      Else '如果当前信息录入有文件代码时,直接按文件所涉及的负责人等信息覆盖
        If Fsta(i) = "已发放" Then
          rs("负责人") = Fincharge(i)
          rs("发放状态") = Fsta(i)
          rs("物料编码") = Mnum(i)
          rs("物料名称") = Mnam(i)
          rs("文件代码") = Mfnum(i)
          rs("文件名称") = Mfnam(i)
        ElseIf Fsta(i) = "发放中" Then
          rs("负责人") = Fincharge(i)
          rs("发放状态") = Fsta(i)
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("物料编码") = Mnum(i)
          rs("物料名称") = Mnam(i)
          rs("任务类型") = "物料新增"
          rs("任务节点") = 3
          rs("文件代码") = Mfnum(i)
          rs("文件名称") = Mfnam(i)
        ElseIf Fsta(i) = "更新中" Then
          rs("负责人") = Fincharge(i)
          rs("发放状态") = Fsta(i)
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("物料编码") = Mnum(i)
          rs("物料名称") = Mnam(i)
          rs("任务类型") = "文件更新"
          rs("任务节点") = 4
          rs("文件代码") = Mfnum(i)
          rs("文件名称") = Mfnam(i)
        End If
      End If
      rs.Update
    Else '当数据库已有当前编码的记录时
      If Mfnum(i) = "" Then '如果新记录没有文件代码
        rs("负责人") = nam(i)
        rs("待处理人") = nam(i)
        rs("待处理人帐号") = Minch(i)
        rs("反馈状态") = "是"
        rs("发放状态") = "待发放"
        rs("任务类型") = "物料新增"
        rs("任务节点") = 1
        rs("反馈时间") = Now
        rs("反馈人") = Usnum
        MaddLo p, lv
      Else
        If Fsta(i) = "已发放" Then
          rs("负责人") = Fincharge(i)
          rs("发放状态") = Fsta(i)
          rs("文件代码") = Mfnum(i)
          rs("文件名称") = Mfnam(i)
        ElseIf Fsta(i) = "发放中" Then
          rs("负责人") = Fincharge(i)
          rs("发放状态") = Fsta(i)
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("任务类型") = "物料新增"
          rs("任务节点") = 3
          rs("文件代码") = Mfnum(i)
          rs("文件名称") = Mfnam(i)
        ElseIf Fsta(i) = "更新中" Then
          rs("负责人") = Fincharge(i)
          rs("发放状态") = Fsta(i)
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("任务类型") = "文件更新"
          rs("任务节点") = 4
          rs("文件代码") = Mfnum(i)
          rs("文件名称") = Mfnam(i)
        End If
      End If
      rs.Update
    End If
  Next
  lv.ListItems.Clear
  
  MsgBox "物料信息已加入数据库", vbInformation, "提示"
2018-06-04 18:13
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:216
帖 子:4233
专家分:25903
注 册:2008-10-15
  得分:20 
MDB超过1W条记录后,就会慢下来。

1、测试方案,使用执行 SQL 命令的方式进行保存数据,估计也不会有改观。
2、换用数据库引擎,如 MSSQL,MYSQL 等等。


授人于鱼,不如授人于渔
早已停用QQ了
2018-06-04 18:21
linandceline
Rank: 2
等 级:论坛游民
威 望:2
帖 子:79
专家分:47
注 册:2014-12-19
  得分:0 
代码精简了一下

  For i = 1 To ww
    DoEvents
    yy = 70 * i / ww
    MDIForm1.ProgressBar1.Value = 30 + Int(yy)
    If Mlist(i) = False Then '当数据库还未有当前编码的记录时
      rs.Addnew
      If Mfnum(i) = "" Then '如果当前信息未录入文件代码时,看是否有负责人
        If nam(i) = "" Then '如果没有负责人,那么当旧编码直接导入
          rs("负责人") = ""
          rs("待处理人") = ""
          rs("待处理人帐号") = ""
          rs("发放状态") = "待发放"
          rs("物料编码") = Mnum(i)
          rs("物料名称") = Mnam(i)
        Else
          rs("负责人") = nam(i)
          rs("待处理人") = nam(i)
          rs("待处理人帐号") = Minch(i)
          rs("反馈状态") = "是"
          rs("物料编码") = Mnum(i)
          rs("物料名称") = Mnam(i)
          rs("发放状态") = "待发放"
          rs("任务类型") = "物料新增"
          rs("任务节点") = 1
          rs("反馈时间") = Now
          rs("反馈人") = Usnum
          MaddLo p, lv
        End If
      Else '如果当前信息录入有文件代码时,直接按文件所设计的负责人等信息覆盖
        rs("负责人") = Fincharge(i)
        rs("发放状态") = Fsta(i)
        rs("文件代码") = Mfnum(i)
        rs("文件名称") = Mfnam(i)
        rs("物料编码") = Mnum(i)
        rs("物料名称") = Mnam(i)
        If Fsta(i) = "发放中" Then
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("任务类型") = "物料新增"
          rs("任务节点") = 3
        ElseIf Fsta(i) = "更新中" Then
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("任务类型") = "文件更新"
          rs("任务节点") = 4
        End If
      End If
      rs.Update
    Else '当数据库已有当前编码的记录时
      If Mfnum(i) = "" Then '如果新记录没有文件代码
        rs("负责人") = nam(i)
        rs("待处理人") = nam(i)
        rs("待处理人帐号") = Minch(i)
        rs("反馈状态") = "是"
        rs("发放状态") = "待发放"
        rs("任务类型") = "物料新增"
        rs("任务节点") = 1
        rs("反馈时间") = Now
        rs("反馈人") = Usnum
        MaddLo p, lv
      Else
        rs("负责人") = Fincharge(i)
        rs("发放状态") = Fsta(i)
        rs("文件代码") = Mfnum(i)
        rs("文件名称") = Mfnam(i)
        rs("物料编码") = Mnum(i)
        rs("物料名称") = Mnam(i)
        If Fsta(i) = "发放中" Then
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("任务类型") = "物料新增"
          rs("任务节点") = 3
        ElseIf Fsta(i) = "更新中" Then
          rs("待处理人帐号") = "dev004"
          rs("待处理人") = fin
          rs("反馈状态") = "是"
          rs("任务类型") = "文件更新"
          rs("任务节点") = 4
        End If
      End If
      rs.Update
    End If
  Next
  lv.ListItems.Clear
  
  MsgBox "物料信息已加入数据库", vbInformation, "提示"
End If
2018-06-04 18:22
Artless
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:99
帖 子:4195
专家分:28789
注 册:2009-4-8
  得分:0 
风版说的是不用addnew试试,不过可能没改善

无知
2018-06-04 23:44
wufuzhang
Rank: 3Rank: 3
来 自:广州
等 级:论坛游侠
威 望:1
帖 子:33
专家分:155
注 册:2017-8-9
  得分:0 
你可以试一下在导入数据到.mdb数据库之前,先压缩一下.mdb。
https://jingyan.baidu.com/article/03b2f78cac0a8d5ea237ae32.html

不经历千百遍的调试,怎能体会成功时那一刹那的喜悦。
2018-06-05 09:40







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028090 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved