我需要使用Access VBA将订单行插入到链接的PostgreQL表中。为了便于报告,我决定将netto价格包含在数字18,2字段中。 我的电脑有比利时时期,使用逗号作为小数分隔符。即0.8表示为0.8
如果插入语句
,这是有问题的部分mijnSQL = "INSERT INTO tblOrderLijnen (OrderID, Nettoprijs )"
mijnSQL = mijnSQL & " VALUES (" & NieuwOrderId& "', " & MijnTempOrderLijn!Prijs * ((100 - Korting) / 100) & ");"
计算结果为0.8(在我的电脑上为0,8)
DoCmd.RunSQL mijnSQL
转换为十进制值无效的查询,因为小数点是逗号。我该如何解决这个问题?
INSERT INTO tblOrderLijnen (OrderID, OrderNr,ArtikelID,Aantal,Nettoprijs )
VALUES (216, 0,8);
字段数不匹配
我将插入更改为引用小数值。这似乎有效,但它有效吗?我以后可以遇到问题吗?
如果插入语句
,这是有问题的部分mijnSQL = "INSERT INTO tblOrderLijnen (OrderID, Nettoprijs )"
mijnSQL = mijnSQL & " VALUES (" & NieuwOrderId& "', " & MijnTempOrderLijn!Prijs * ((100 - Korting) / 100) & ");"
答案 0 :(得分:3)
考虑SQL参数化(应用层代码中使用的任何SQL语句的行业标准,如VBA),而不仅仅是防止SQL注入。而不只是Access或Postgres。参数化有助于避免引用封装,转义特殊字符,字符串连接以及指定数据类型以与区域设置保持一致。
在MS Access中,您可以使用PARAMETERS
子句(在Access SQL方言中有效)并使用querydefs在VBA中绑定值。此外,由于看到的代码更清晰,更易于维护。
Dim qdef As QueryDef
...
' PREPARED STATEMENT (NO DATA)
mijnSQL = "PARAMETERS [firstparam] Long, [secondparam] Double;" _
& " INSERT INTO tblOrderLijnen (OrderID, Nettoprijs)" _
& " VALUES ([firstparm], [secondparam]);"
' INITIALIZE QUERYDEF
Set qdef = CurrentDb.CreateQueryDef("", mijnSQL)
' BIND PARAMS
qdef![firstparam] = NieuwOrderId
qdef![secondparam] = MijnTempOrderLijn!Prijs * ((100 - Korting) / 100)
' EXECUTE ACTION QUERY
qdef.Execute dbFailOnError
Set qdef = Nothing
答案 1 :(得分:1)
使用 Str 进行转换。它总是强制一个点作为小数分隔符:
mijnSQL = mijnSQL & " VALUES (" & NieuwOrderId& "', " & Str(MijnTempOrderLijn!Prijs * ((100 - Korting) / 100)) & ");"
或者使用我的CSql函数构建连接的SQL。
答案 2 :(得分:0)
这应该有效:
Dim Nettoprijs_temp as Single
Nettoprijs_temp = MijnTempOrderLijn!Prijs * ((100 - Korting) / 100)
mijnSQL = "INSERT INTO tblOrderLijnen (OrderID, Nettoprijs )VALUES (NieuwOrderId, " & Nettoprijs_temp & ");"