多列场景下Excel通过SQL插入与更新数据失败问题求助
问题:SQL操作Excel失败,需一次性写入全部17列数据
问题描述
通过SQL向Excel插入数据时遇到两个问题:
- 首次INSERT操作不被Excel接受
- 后续执行UPDATE语句时,
BD.Execute SQL行无法正常执行
当前代码逻辑为先插入ID、COD_LINHA等12列数据,再通过UPDATE更新VELOCIDADE等第13至17列数据,现需改为一次性写入全部17列数据来解决问题。
原代码
For Linhas = 2 To UltLinhaBD Set Planilha = ThisWorkbook.Worksheets("Apontamento") Set LinhaDados = Planilha.Rows(Linhas) SQL = "INSERT INTO [APONTAMENTO$] (ID, COD_LINHA, DATA, LOTE, COD_PRODUTO, COD_EVENTO, COD_SUBEVENTO, INICIO, TERMINO, QTDE_PROD, PERDAS, OBSERVACAO) VALUES (" & LinhaDados.Cells(1).Value & ", '" & LinhaDados.Cells(2).Value & "', '" & LinhaDados.Cells(3).Value & "', '" & LinhaDados.Cells(4).Value & "', '" & LinhaDados.Cells(5).Value & "', '" & LinhaDados.Cells(6).Value & "', '" & LinhaDados.Cells(7).Value & "', '" & Format(LinhaDados.Cells(8).Value, "h:mm") & "', '" & Format(LinhaDados.Cells(9).Value, "h:mm") & "', " & LinhaDados.Cells(10).Value & ", " & LinhaDados.Cells(11).Value & ", '" & LinhaDados.Cells(12).Value & "')" BD.Open cs Consulta.Open SQL, BD '从第13列开始执行更新 SQL = "UPDATE [APONTAMENTO$] SET VELOCIDADE = '" & LinhaDados.Cells(13).Value & "', ID_OP = " & _ LinhaDados.Cells(14).Value & ", ID_USER = " & LinhaDados.Cells(15).Value & ", HORARIO_REG = '" & _ LinhaDados.Cells(16).Value & "', COD_TURNO = '" & LinhaDados.Cells(17).Value & "' WHERE ID = " & LinhaDados.Cells(1).Value BD.Execute SQL BD.Close Next
解决方案:一次性插入全部17列
修改INSERT语句直接包含所有17列,移除UPDATE步骤,同时优化连接的打开/关闭逻辑(放在循环外提升效率):
'将连接打开放在循环外,避免重复操作 BD.Open cs Set Planilha = ThisWorkbook.Worksheets("Apontamento") For Linhas = 2 To UltLinhaBD Set LinhaDados = Planilha.Rows(Linhas) '一次性插入全部17列数据 SQL = "INSERT INTO [APONTAMENTO$] (ID, COD_LINHA, DATA, LOTE, COD_PRODUTO, COD_EVENTO, COD_SUBEVENTO, INICIO, TERMINO, QTDE_PROD, PERDAS, OBSERVACAO, VELOCIDADE, ID_OP, ID_USER, HORARIO_REG, COD_TURNO) " & _ "VALUES (" & LinhaDados.Cells(1).Value & ", '" & LinhaDados.Cells(2).Value & "', '" & LinhaDados.Cells(3).Value & "', '" & LinhaDados.Cells(4).Value & "', '" & LinhaDados.Cells(5).Value & "', '" & LinhaDados.Cells(6).Value & "', '" & LinhaDados.Cells(7).Value & "', '" & Format(LinhaDados.Cells(8).Value, "h:mm") & "', '" & Format(LinhaDados.Cells(9).Value, "h:mm") & "', " & LinhaDados.Cells(10).Value & ", " & LinhaDados.Cells(11).Value & ", '" & LinhaDados.Cells(12).Value & "', '" & LinhaDados.Cells(13).Value & "', " & LinhaDados.Cells(14).Value & ", " & LinhaDados.Cells(15).Value & ", '" & LinhaDados.Cells(16).Value & "', '" & LinhaDados.Cells(17).Value & "')" BD.Execute SQL Next '循环结束后再关闭连接 BD.Close
额外注意事项
- 原代码中
Consulta.Open SQL, BD是多余的,INSERT操作不需要用Recordset打开,直接用BD.Execute执行即可 - 字符串拼接SQL存在语法风险,若数据中包含单引号会导致SQL报错,建议使用参数化查询优化
- 确保Excel工作表
Apontamento的列名与SQL中的字段名完全匹配,部分ODBC驱动对大小写敏感
内容的提问来源于stack exchange,提问作者Rodrigo Gonçalves Costa
相关产品推荐
相关产品推荐

