| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3068 人关注过本帖, 1 人收藏
标题:怎么快速的往MDB中写大量数据
只看楼主 加入收藏
linandceline
Rank: 2
等 级:论坛游民
威 望:2
帖 子:88
专家分:47
注 册:2014-12-19
结帖率:78.95%
收藏(1)
已结贴  问题点数: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, "提示"
搜索更多相关主题的帖子: 状态 If 文件 处理 任务 
2018-06-04 18:13
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4938
专家分:30047
注 册:2008-10-15
收藏
得分:20 
MDB超过1W条记录后,就会慢下来。

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


授人于鱼,不如授人于渔
早已停用QQ了
2018-06-04 18:21
linandceline
Rank: 2
等 级:论坛游民
威 望:2
帖 子:88
专家分: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
等 级:贵宾
威 望:103
帖 子:4211
专家分:28888
注 册:2009-4-8
收藏
得分:0 
风版说的是不用addnew试试,不过可能没改善

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

不经历千百遍的调试,怎能体会成功时那一刹那的喜悦。
2018-06-05 09:40
快速回复:怎么快速的往MDB中写大量数据
数据加载中...
 
   



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

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