Access在Postgresql中插入带小数点逗号的数字

Access在Postgresql中插入带小数点逗号的数字,sql,vba,postgresql,ms-access,decimal-point,Sql,Vba,Postgresql,Ms Access,Decimal Point,我需要使用Access VBA在orderline上插入到链接的PostgreQL表中。为了便于报告,我决定包括净额价格,这是一个数字18,2字段。 我的电脑有一个比利时句号,用逗号作为小数点分隔符。i、 e.0.8表示为0,8 如果insert语句 mijnSQL=“插入tblOrderLijnen(OrderID,Nettoprijs)” mijnSQL=mijnSQL&“值(&NieuwOrderId&“,”&mijntromperderlijn!Prijs*((100-Korting)/

我需要使用Access VBA在orderline上插入到链接的PostgreQL表中。为了便于报告,我决定包括净额价格,这是一个数字18,2字段。 我的电脑有一个比利时句号,用逗号作为小数点分隔符。i、 e.0.8表示为0,8

如果insert语句

mijnSQL=“插入tblOrderLijnen(OrderID,Nettoprijs)”
mijnSQL=mijnSQL&“值(&NieuwOrderId&“,”&mijntromperderlijn!Prijs*((100-Korting)/100)&”)
计算结果为0.8(在我的计算机上为0.8)

DoCmd.RunSQL mijnSQL
转换为一个查询,其中十进制值无效,因为小数点是逗号。我怎样才能解决这个问题

插入tblOrderLijnen(订单ID、订单NR、ArtikelID、Aantal、Nettoprijs)
数值(216,0,8);
字段数不匹配

我将插入改为引用十进制值。这似乎有效,但它有效吗?我以后会遇到问题吗

如果insert语句

mijnSQL=“插入tblOrderLijnen(OrderID,Nettoprijs)”
mijnSQL=mijnSQL&“值(&NieuwOrderId&“,”&mijntromperderlijn!Prijs*((100-Korting)/100)&”)
这应该可以:

Dim Nettoprijs_temp as Single
Nettoprijs_temp = MijnTempOrderLijn!Prijs * ((100 - Korting) / 100)
mijnSQL = "INSERT INTO tblOrderLijnen (OrderID, Nettoprijs )VALUES (NieuwOrderId, " & Nettoprijs_temp & ");"

考虑SQL参数化(VBA等应用层代码中使用的任何SQL语句的行业标准),而不仅仅是防止SQL注入。而不仅仅是访问或博士后。参数化有助于避免引号括起、转义特殊字符、字符串连接以及指定数据类型以与区域设置对齐

在MS Access中,您可以使用
PARAMETERS
子句(在Access SQL方言中有效)并使用绑定VBA中的值。此外,正如所见,代码更干净,更易于维护

Dim qdef作为QueryDef
...
'准备好的报表(无数据)
mijnSQL=“参数[firstparam]Long,[secondparam]Double;”_
&“插入tblOrderLijnen(订单ID,Nettoprijs)”\u
&值([firstparm]、[secondparam])
'初始化QUERYDEF
Set qdef=CurrentDb.CreateQueryDef(“,mijnSQL)
“绑定参数
qdef![firstparam]=NieuwOrderId
qdef![secondparam]=mijntromporderlijn!Prijs*((100-Korting)/100)
'执行操作查询
qdef.executedbfailonerror
设置qdef=Nothing
使用Str进行转换。它将始终强制使用一个点作为十进制分隔符:

mijnSQL = mijnSQL & " VALUES (" & NieuwOrderId& "', " & Str(MijnTempOrderLijn!Prijs * ((100 - Korting) / 100)) & ");"

或者使用my函数构建连接的SQL。

一个解决方案是使用正确的参数化查询,而不是将所有内容转换为字符串并连接它们,即将浮点值作为字符串传递给服务器。也就是说,即使您的值为
216
0.8
,字段数也不正确:您为5个字段指定了2个值。请使用参数(准备好的查询)。它是对非美国应用程序(数字、货币、日期)的基本保护@JacekCz它是对任何远程处理SQL(美国或非美国)的基本保护。谢谢。我将研究参数化。FIELSD数量的错误是由于我简化了查询。感谢Mat的补充评论。非常感谢。这就是我所需要的。我特别感谢你给我举了一个很好的例子。这真的让我上路了,太棒了!很乐意帮忙。请注意StackOverflow的特殊表达方式。谢谢。通过引用,我基本上也这么做了。就我所知,Csql不是一个访问函数。那么,请为您的问题添加基本相同的解决方案。没错,CSql不是VBA的原生语言,这就是为什么它是编写的。