Access 2003插入UK格式日期被转为US格式的解决问询
解决Access 2003插入日期时格式混淆的问题
这个问题的核心是Access解析#包裹的日期字符串时,会遵循系统区域设置的日期格式——如果你的系统默认是MM/dd/yyyy(美式格式),那么#07/01/2019#就会被自动解析为2019年7月1日,而不是你预期的1月7日。之前用Format(qtyPrice.dateQuoted, "dd/MM/yyyy")没用,是因为即使你生成了07/01/2019这样的字符串,Access还是会按系统规则去“猜”哪个是月哪个是日,结果依然出错。
下面给你两个可靠的解决方法,按推荐程度排序:
方法1:使用参数化查询(最推荐)
参数化查询会直接传递日期的数值类型,而不是转成字符串,完全跳过格式解析的环节,同时还能避免SQL注入风险,代码更健壮。示例代码如下:
' 假设你已经有一个打开的ADODB.Connection对象(比如conn) Dim cmd As New ADODB.Command Set cmd.ActiveConnection = conn ' 定义带参数的SQL语句,用?作为占位符 cmd.CommandText = "INSERT INTO [stockQuantities] " & _ "([stockCode], [description], [productGroup], [qtyFrom], [price], [dateQuoted]) " & _ "VALUES (?, ?, ?, ?, ?, ?)" ' 逐个添加参数,指定类型和值 cmd.Parameters.Append cmd.CreateParameter("stockCode", adVarChar, adParamInput, 50, qtyPrice.code) cmd.Parameters.Append cmd.CreateParameter("description", adVarChar, adParamInput, 255, qtyPrice.desc) cmd.Parameters.Append cmd.CreateParameter("productGroup", adVarChar, adParamInput, 50, qtyPrice.group) cmd.Parameters.Append cmd.CreateParameter("qtyFrom", adDouble, adParamInput, , qtyPrice.qty) cmd.Parameters.Append cmd.CreateParameter("price", adCurrency, adParamInput, , qtyPrice.price) cmd.Parameters.Append cmd.CreateParameter("dateQuoted", adDate, adParamInput, , qtyPrice.qDate) ' 执行插入 cmd.Execute
方法2:强制使用ISO日期格式(yyyy-MM-dd)
Access对yyyy-MM-dd格式的日期字符串有特殊处理,无论系统区域设置如何,都会正确解析为年-月-日。你只需要修改SQL中日期的拼接部分:
把原来的:
"#, #" & qtyPrice.qDate & "#);"
改成:
"#, #" & Format(qtyPrice.qDate, "yyyy-MM-dd") & "#);"
修改后的SQL语句会变成:
INSERT INTO [stockQuantities] ([stockCode], [description], [productGroup], [qtyFrom], [price], [dateQuoted]) VALUES ("010010000", "R&B BOT Gl Etched 100ml Temple Spa Logo", "PACK", 100, 98, #2019-01-07#);
这样Access就会明确识别这是2019年1月7日。
不推荐的方法:修改系统区域设置
你可以把系统的短日期格式改成dd/MM/yyyy,这样Access就能正确解析#07/01/2019#,但这个方法只适合你自己的机器——如果程序要分发给其他用户,他们的系统设置可能不一样,问题会再次出现,所以不建议这么做。
内容的提问来源于stack exchange,提问作者Harambe
相关产品推荐
相关产品推荐

