ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4128|回复: 19

[求助] 更新access记录速度慢怎么办?已上传附件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-24 11:42 | 显示全部楼层 |阅读模式
本帖最后由 zxyu 于 2014-12-25 17:20 编辑

    求助:通过学习赵老师的插入并更新access数据库代码,可是在数据量大(2万条以上),字段多(158个字段)数据库存放在局域网内的服务器上(没有上传附件),使用以下代码时更新速度很慢,怎么改写希望能得到帮助,谢谢了!

上传.rar (372.37 KB, 下载次数: 8)
登陆用户名:焦勇
密码:123456
数据库密码:123
vba工程密码:123457

需要按照申请时间和身份证号码两个字段同时相同更新记录(现在当数据库数据存放在局域网服务器上,数据量大的时候更新速度很慢)。
另外关闭弹出vba工程密码不知什么缘故。


  1. Sub 上传保存数据()
  2. Sheets("农户台账新").Activate
  3. If Cells(2, 2) = "" Then
  4. MsgBox ("输入信息请从第二行往下输入!")
  5. Exit Sub
  6. ElseIf Cells(2, 65) = "" Then
  7. MsgBox ("请输入经办客户经理!")
  8. Exit Sub
  9. ElseIf Cells(2, 2) <> "" Then

  10. aa = Timer   '获取当前时间

  11.     Dim CNN As New ADODB.Connection
  12.     Dim sql$, s$
  13.      MYPATH = "\\10.52.2.6\ww\db.mdb"
  14.      
  15.     s = "[Excel 8.0;Database=" & ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "[        DISCUZ_CODE_0        ]quot; & [a1].CurrentRegion.Address(0, 0) & "]"
  16.     CNN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MYPATH & ";jet oledb:database password=123"
  17.     '删除数据库可能存在的工作表信息
  18.    
  19.   sql = "delete from 农户台账 where 申请时间 in(select 申请时间 from " & s & ") and 身份证号码 in(select 身份证号码 from " & s & ")"
  20.     CNN.Execute sql
  21. '    工作表信息追加到数据库表
  22.     sql = "insert into 农户台账 select * from " & s
  23.     CNN.Execute sql
  24.     CNN.Close
  25.     Set CNN = Nothing

  26.      MsgBox "数据保存完毕:耗时" & Format(Timer - aa, "0.000") & "秒", vbInformation, "提示信息"
  27.     End If
  28. End Sub
复制代码




TA的精华主题

TA的得分主题

发表于 2014-12-24 11:50 | 显示全部楼层
CNN.Execute 是很慢的

要用 recordset

TA的精华主题

TA的得分主题

发表于 2014-12-24 13:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
sql = "delete from 农户台账 where 申请时间 in(select 申请时间 from " & s & ") and 身份证号码 in(select 身份证号码 from " & s & ")"

in或者not in 本身就慢

身份证号码添加索引,然后

循环语句
for
sql = "delete from 农户台账 where 申请时间 =### and 身份证号码 =###
next
这样试下。

TA的精华主题

TA的得分主题

发表于 2014-12-24 13:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请参考我的另一个帖子:
根据工作表批量更新Access数据库并向数据库添加不存在的记录(不使用循环)
http://club.excelhome.net/thread-1023579-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-24 14:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2014-12-24 13:41
请参考我的另一个帖子:
根据工作表批量更新Access数据库并向数据库添加不存在的记录(不使用循环)
http:/ ...

非常感谢赵老师的帮助,希望你也能多休息,身体健康,节日快乐。

点评

谢谢,谢谢,哈哈  发表于 2014-12-24 15:23

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-25 09:26 | 显示全部楼层
使用了赵老师的《根据工作表批量更新Access数据库并向数据库添加不存在的记录(不使用循环) 》代码,又有了新问题,字段名为1姓名、2姓名、3姓名这种的会提示语法错误(操作符丢失),如果把字段名改为姓名1、姓名2、等,又会出问题,主要是我的字段数太多了,是从A到FB列,共158个。

TA的精华主题

TA的得分主题

发表于 2014-12-25 11:30 | 显示全部楼层
zxyu 发表于 2014-12-25 09:26
使用了赵老师的《根据工作表批量更新Access数据库并向数据库添加不存在的记录(不使用循环) 》代码,又有了新 ...

上传附件吧,保留少量模拟数据,并说明按照哪个字段更新

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-25 17:19 | 显示全部楼层
zhaogang1960 发表于 2014-12-25 11:30
上传附件吧,保留少量模拟数据,并说明按照哪个字段更新

附件已经上传。谢谢赵老师。
登陆用户名:焦勇
密码:123456
数据库密码:123
vba工程密码:123457

需要按照申请时间和身份证号码两个字段同时相同更新记录(现在当数据库数据存放在局域网服务器上,数据量大的时候更新速度很慢)。


另外关闭弹出vba工程密码不知什么缘故。

TA的精华主题

TA的得分主题

发表于 2014-12-25 20:06 | 显示全部楼层
zxyu 发表于 2014-12-25 17:19
附件已经上传。谢谢赵老师。
登陆用户名:焦勇
密码:123456

用个笨办法吧:
  1. Sub updateaddRecords2003()
  2. '引用Microsoft ActiveX Data Objects 2.x Library
  3.     Dim cnn As New ADODB.Connection
  4.     Dim rs As ADODB.Recordset
  5.     Dim myPath As String
  6.     Dim myTable As String
  7.     Dim arr As Variant, i&, j&
  8.     myPath = ThisWorkbook.Path & "\db.mdb;jet oledb:database password=123"
  9.     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & myPath '连接数据库
  10.     myTable = "农户台账"
  11.     arr = [a1].CurrentRegion
  12.     For i = 2 To UBound(arr)
  13.         Sql = "select * from " & myTable & " where 申请时间=#" & arr(i, 1) & "# and 身份证号码='" & arr(i, 3) & "'"
  14.         Set rs = New ADODB.Recordset
  15.         rs.Open Sql, cnn, adOpenKeyset, adLockOptimistic
  16.         If rs.RecordCount = 0 Then
  17.             rs.AddNew
  18.             rs.Fields(1) = arr(i, 2)
  19.             For j = 4 To rs.Fields.Count
  20.                 rs.Fields(j - 1) = arr(i, j)
  21.             Next j
  22.             rs.Update
  23.         Else
  24.             rs.Fields(1) = arr(i, 2)
  25.             For j = 4 To rs.Fields.Count
  26.                 rs.Fields(j - 1) = arr(i, j)
  27.             Next j
  28.             rs.Update
  29.         End If
  30.     Next i
  31.     MsgBox "数据保存完毕!", vbInformation + vbOKOnly
  32.     rs.Close
  33.     cnn.Close
  34.     Set rs = Nothing
  35.     Set cnn = Nothing
  36. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-25 20:07 | 显示全部楼层
速度可能很慢,请测试附件
上传.rar (135.03 KB, 下载次数: 9)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 13:40 , Processed in 0.042771 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表