ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 关于使用SQL语句批量插入与更新Access数据库的问题(不删除原来的数据插入新数据)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-5-21 21:47 | 显示全部楼层 |阅读模式
本帖最后由 ︶ㄣ寒冰 于 2018-5-24 00:37 编辑

之前以为这个代码可以批量的完成数据库更新和插入功能,实际上最近才发现这个插入只能一次性的,很是头痛!解决方法和代码见4楼

问题:
1.数据库中没有记录时,第一次运行Excel表中的代码,可以将表格中现有记录全部插入数据库;之后再运行代码,无法将表中新增记录插入数据库。
2.当修改Excel表格中发货情况时,如有相同订单号时,只有修改对应订单号最后一条记录时,才会更新,且会将最后一条记录前相同订单号的数据都更新。

需求:
1.在不删除Access数据库中原有记录的前提下,在Excel表格中增加记录后,运行代码可将新增记录插入数据库中;
2.当修改Excel表格中某条生产记录发货状态后,通过Excel记录中“生产订单号”和“产品型号”对数据中的对应记录进行更新;

最后,如果有办法解决,还请对原代码的问题加以说明,谢谢!

  1. Public Datapath, DataName, DataTable, act As String, Error%
  2. Public cnn As ADODB.Connection, rs As ADODB.Recordset

  3. Sub Init()
  4.     '设置服务器地址、数据库名称及数据表名称
  5.     Datapath = ThisWorkbook.Path & "" '"\\192.168.1.88\Database" '数据库地址
  6.     DataName = "production_database.mdb" ' "数据库名称"
  7.     DataTable = "Order_information"  ' "查询数据库中数据表名"
  8.     act = Split(Split(ActiveWorkbook.Name, "_")(1), ".")(0) & "[        DISCUZ_CODE_0        ]quot;
  9.    
  10.     '设置数据库连接并测试连接是否正常
  11.     On Error Resume Next
  12.     Set cnn = New ADODB.Connection
  13.     cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;jet oledb:database password = vadsys;Data Source=" & Datapath & DataName '连接数据库
  14.     If Err.Number Then
  15.         'MsgBox Err.Description, , "错误提示"
  16.         MsgBox "请确认数据路径或名称是否正确!", , "错误提示"
  17.     Else
  18.         On Error GoTo 0
  19.         If cnn.State <> 1 Then
  20.             MsgBox "连接数据库失败,请检查网络连接!", , "连接失败"
  21.             cnn.Close
  22.             Set cnn = Nothing
  23.         End If
  24.     End If
  25. End Sub

  26. Sub Uploading_data()
  27.     Application.ScreenUpdating = False
  28.     'ActiveSheet.Unprotect Password:="vadsys" '撤消工作表保护
  29.     Dim Target As String
  30.     Dim i As Integer
  31.     Call Init
  32.    
  33.     For i = 1 To Sheets.Count
  34.         If Sheets(i).Name = Split(act, "[        DISCUZ_CODE_0        ]quot;)(0) Then
  35.             With Sheets(i)
  36.                 .Activate
  37.                 '生成更新字符串,如:a.姓名=b.姓名,a.性别=b.性别,……
  38.                 arrFields = .Range("A1:X1") '工作表中的字段名写入数组
  39.                 For Z = 2 To UBound(arrFields, 2) '生成更新字符串
  40.                     StrTemp = StrTemp & ",a." & arrFields(1, Z) & "=b." & arrFields(1, Z)
  41.                 Next
  42.                 '生成更新区域
  43.                 x = .Cells(Rows.Count, 1).End(xlUp).Row  '检查A列行数是否>1,>1则判定为有数据生成更新区域,否则退出程序
  44.                 If x > 1 Then
  45.                 s = "[Excel 12.0;imex=0;Database=" & ThisWorkbook.FullName & "].[" & act & [a1].CurrentRegion.Address(0, 0) & "]"
  46.                 Else
  47.                 Exit Sub
  48.                 End If
  49.             End With
  50.             '生成更新SQL语句(请注意Office2007后需要加imex=0参数)
  51.             sql = "update " & DataTable & " a," & s & " b set " & Mid(StrTemp, 2) & " where a.生产订单号=b.生产订单号 and a.产品型号=b.产品型号"
  52.             cnn.Execute sql '不判断,更新可能存在的“SN”
  53.             
  54.             '将工作表信息追加到数据库表
  55.             sql = "insert into " & DataTable & " select * from " & s & " b where not exists"
  56.             sql = sql & "(select * from " & DataTable & " a," & s & " b where b.生产订单号=a.生产订单号)" ' and b.产品型号=a.产品型号)"
  57.             cnn.Execute (sql)
  58.             
  59.             '关闭连接释放内存
  60.             cnn.Close
  61.             Set cnn = Nothing
  62.             MsgBox "保存出货记录成功并上传数据库!", , "保存成功"
  63.             Error = 0
  64.             Exit Sub
  65.         ElseIf i = Sheets.Count Then
  66.         Error = 1
  67.         MsgBox "请修改文件名格式如“订单执行及变更情况_2018年05月”,并将记录订单信息的表单名修改为“2018年05月”,保持与文件名中“_”后的部分一致,请修改后重试!", , "文件名格式不正确"
  68.         End If
  69.     Next
  70.    
  71.     'ActiveSheet.Protect Password:="vadsys"
  72.     ActiveWorkbook.RemovePersonalInformation = False
  73.     Application.ScreenUpdating = True
  74. End Sub
复制代码

test.zip (909.71 KB, 下载次数: 24)


TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-22 14:57 | 显示全部楼层
目前这个趋势,有必要自己顶下!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-23 22:03 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-24 00:33 | 显示全部楼层


灵光一闪,问题已解决。
使用not in代替not exist,不过原理上还是没有搞懂,如有大神看到此贴还请赐教!
  1. Public Datapath, DataName, DataTable, act As String, Error%
  2. Public cnn As ADODB.Connection, rs As ADODB.Recordset

  3. Sub Init()
  4.     '设置服务器地址、数据库名称及数据表名称
  5.     Datapath = ThisWorkbook.Path & "" '"\\192.168.1.88\Database" '数据库地址
  6.     DataName = "production_database.mdb" ' "数据库名称"
  7.     DataTable = "Order_information"  ' "查询数据库中数据表名"
  8.     act = Split(Split(ActiveWorkbook.Name, "_")(1), ".")(0) & "$"
  9.    
  10.     '设置数据库连接并测试连接是否正常
  11.     On Error Resume Next
  12.     Set cnn = New ADODB.Connection
  13.     cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;Data Source=" & Datapath & DataName '连接数据库
  14.     If Err.Number Then
  15.         'MsgBox Err.Description, , "错误提示"
  16.         MsgBox "请确认数据路径或名称是否正确!", , "错误提示"
  17.     Else
  18.         On Error GoTo 0
  19.         If cnn.State <> 1 Then
  20.             MsgBox "连接数据库失败,请检查网络连接!", , "连接失败"
  21.             cnn.Close
  22.             Set cnn = Nothing
  23.         End If
  24.     End If
  25. End Sub

  26. Sub Uploading_data()
  27.     Application.ScreenUpdating = False
  28.     'ActiveSheet.Unprotect Password:="vadsys" '撤消工作表保护
  29.     Dim Target As String
  30.     Dim i As Integer
  31.     Call Init
  32.    
  33.     For i = 1 To Sheets.Count
  34.         If Sheets(i).Name = Split(act, "$")(0) Then
  35.             With Sheets(i)
  36.                 .Activate
  37.                 '生成更新字符串,如:a.姓名=b.姓名,a.性别=b.性别,……
  38.                 arrFields = .Range("A1:X1") '工作表中的字段名写入数组
  39.                 For Z = 2 To UBound(arrFields, 2) '生成更新字符串
  40.                     StrTemp = StrTemp & ",a." & arrFields(1, Z) & "=b." & arrFields(1, Z)
  41.                 Next
  42.                 '生成更新区域
  43.                 x = .Cells(Rows.Count, 2).End(xlUp).Row  '检查A列行数是否>1,>1则判定为有数据生成更新区域,否则退出程序
  44.                 If x > 1 Then
  45.                 s = "[Excel 12.0;imex=0;Database=" & ThisWorkbook.FullName & "].[" & act & [a1].CurrentRegion.Address(0, 0) & "]"
  46.                 Else
  47.                 Exit Sub
  48.                 End If
  49.             End With
  50.             '生成更新SQL语句(请注意Office2007后需要加imex=0参数)
  51.             Sql = "update " & DataTable & " a," & s & " b set " & Mid(StrTemp, 2) & " where a.生产订单号&a.产品型号=b.生产订单号&b.产品型号"
  52.             cnn.Execute Sql '不判断,更新可能存在的“SN”
  53.             
  54.             '将工作表信息追加到数据库表
  55.             Sql = "insert into " & DataTable & " select * from " & s & " where 生产订单号&产品型号 not in"
  56.             Sql = Sql & "(select b.生产订单号&b.产品型号 from " & DataTable & " a," & s & " b where a.生产订单号&a.产品型号=b.生产订单号&b.产品型号)"
  57.             cnn.Execute (Sql)
  58.             
  59.             '关闭连接释放内存
  60.             cnn.Close
  61.             Set cnn = Nothing
  62.             MsgBox "保存出货记录成功并上传数据库!", , "保存成功"
  63.             Error = 0
  64.             Exit Sub
  65.         ElseIf i = Sheets.Count Then
  66.         Error = 1
  67.         MsgBox "请修改文件名格式如“订单执行及变更情况_2018年05月”,并将记录订单信息的表单名修改为“2018年05月”,保持与文件名中“_”后的部分一致,请修改后重试!", , "文件名格式不正确"
  68.         End If
  69.     Next
  70.    
  71.     ActiveWorkbook.RemovePersonalInformation = False
  72.     Application.ScreenUpdating = True
  73. End Sub
复制代码



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 06:10 , Processed in 0.036115 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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