访问将带有十进制逗号的数字插入Postgresql

时间:2017-11-01 20:14:21

标签: sql vba postgresql ms-access decimal-point

我需要使用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) & ");"

3 个答案:

答案 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 & ");"