如何通过VBA将Excel中的日期/时间数据导入SQL
正确的Excel日期/时间导入SQL的VBA实现方式
原代码存在的问题
- 直接拼接SQL字符串,存在SQL注入风险,且日期格式依赖系统环境,极易出现解析错误
- 日期值转字符串插入时,不同数据库/地区的日期格式规则不同,会导致数据导入失败或格式混乱
优化后的实现方案(参数化查询)
使用ADODB.Command执行参数化查询,既能避免注入风险,又能正确处理日期/时间类型的传递:
Dim cmd As ADODB.Command ' 处理插入操作 Set cmd = New ADODB.Command cmd.ActiveConnection = con cmd.CommandType = adCmdText ' 编写带参数占位符的SQL语句,关键字Order需用方括号包裹 cmd.CommandText = "INSERT INTO STDCT ([Order], PlanProductionTime, Cavity, Toynum, STD, DT) VALUES (?, ?, ?, ?, ?, ?)" ' 按顺序添加参数,匹配字段类型 With cmd.Parameters ' 数值类型参数 .Append cmd.CreateParameter("Order", adDouble, adParamInput, , row.Cells(1).Value) .Append cmd.CreateParameter("PlanProductionTime", adDouble, adParamInput, , row.Cells(2).Value) .Append cmd.CreateParameter("Cavity", adDouble, adParamInput, , row.Cells(3).Value) .Append cmd.CreateParameter("STD", adDouble, adParamInput, , row.Cells(5).Value) ' 文本类型参数,255为字段最大长度,可根据实际调整 .Append cmd.CreateParameter("Toynum", adVarChar, adParamInput, 255, row.Cells(4).Value) ' 日期/时间类型参数,直接传入Excel单元格值,无需转换 .Append cmd.CreateParameter("DT", adDate, adParamInput, , row.Cells(6).Value) End With ' 执行插入 cmd.Execute ' 处理删除操作 Set cmd = New ADODB.Command cmd.ActiveConnection = con cmd.CommandText = "DELETE FROM STDCT WHERE [Order] = 0" ' Order为数值类型,无需加单引号 cmd.Execute
关键说明
- 参数化查询:通过占位符
?替代直接拼接变量,彻底避免SQL注入,同时保证类型匹配 - 日期处理:使用
adDate类型参数传递Excel日期值,数据库会自动识别为对应日期/时间类型,无需手动转字符串 - 关键字处理:
Order是SQL保留关键字,必须用方括号[]包裹,避免语法错误 - 数值类型:删除语句中
[Order] = 0无需加单引号,若加引号会导致数值与字符串的类型不匹配错误
内容的提问来源于stack exchange,提问作者Pakkapol SRIMONGKOL
相关产品推荐
相关产品推荐

