VBA通过ADO上传SQL时,如何修改系统小数分隔符(规避Replace)
VBA通过ADO向SQL上传货币类型数据的分隔符问题解决
一、能否修改系统小数分隔符?
可以通过RegWrite修改注册表中的系统小数分隔符,代码如下:
Dim myShell As Object Set myShell = CreateObject("WScript.Shell") ' 将系统小数分隔符设为点 myShell.RegWrite "HKCU\Control Panel\International\sDecimal", ".", "REG_SZ"
但绝对不推荐这么做:修改系统区域设置会影响所有依赖该配置的程序,可能导致其他软件出现格式错误;而且修改后需要重启Excel甚至系统才能生效,操作成本高且风险极大。
二、无需改系统/用Replace的安全方案
1. 参数化查询(首推)
参数化查询能自动适配SQL的数据格式,还能避免SQL注入,是最稳妥的方式:
Dim conn As ADODB.Connection Dim cmd As ADODB.Command Set conn = New ADODB.Connection conn.Open "你的SQL连接字符串" Set cmd = New ADODB.Command cmd.ActiveConnection = conn cmd.CommandText = "INSERT INTO 目标表 (货币字段) VALUES (?)" ' 直接传入货币变量,ADO自动处理格式 cmd.Parameters.Append cmd.CreateParameter("currParam", adCurrency, adParamInput, , 你的货币变量) cmd.Execute conn.Close Set cmd = Nothing Set conn = Nothing
2. 用Format函数强制指定格式
直接将货币值格式化为带小数点的字符串,不受系统设置影响:
Dim currVal As Currency currVal = 94.5 ' 你的原始货币变量 Dim sqlReadyVal As String ' 用英文区域格式强制生成点分隔的字符串,小数位数可按需调整 sqlReadyVal = Format(currVal, "0.0", vbEnglishUS) ' 之后将sqlReadyVal用于你的INSERT语句即可
3. 直接传递数值类型
如果要拼接SQL语句,别把数值转成字符串,直接传递数值类型:
' 假设currVal是Currency类型的变量 strSql = "INSERT INTO 目标表 (货币字段) VALUES (" & CDbl(currVal) & ")"
ADO会自动处理数值到SQL格式的转换,完全不用手动管分隔符。
内容的提问来源于stack exchange,提问作者Mik
相关产品推荐
相关产品推荐

