【问题标题】:Access insert numeric with decimal comma into Postgresql访问将带有小数点逗号的数字插入 Postgresql
【发布时间】:2018-04-14 05:57:38
【问题描述】:

我需要使用 Access VBA 在 orderline 上插入链接的 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) & ");"

【问题讨论】:

  • 一种解决方案是使用正确参数化的查询,而不是将所有内容转换为字符串并将它们连接起来 - 即将浮点值传递给服务器。也就是说,即使您的值为 2160.8,字段数也不正确:您为 5 个字段指定了 2 个值。
  • 使用参数(准备好的查询)。它是对非​​美国应用程序(数字、货币、日期)的基本保护
  • @JacekCz 它是任何远程处理 SQL 的基本保护,无论是否美国。
  • 谢谢。我会看看参数化。字段数量的错误是由于我简化了查询。感谢 Mat 的补充评论。

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


【解决方案1】:

这应该可行:

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

【讨论】:

    【解决方案2】:

    除了简单地防止 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
    

    【讨论】:

    • 非常感谢。这就是我需要的
    • 我特别感谢这个优秀的例子。这真的让我上路了。
    • 太棒了!乐意效劳。请注意在 StackOverflow 上说 thanks 的特殊方式。
    【解决方案3】:

    使用 Str 进行转换。它总是强制一个点作为小数分隔符:

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

    或者使用我的 CSql 函数构建您的串联 SQL。

    【讨论】:

    • 谢谢。通过使用引号,我基本上也是这样做的。据我所知,Csql 不是 Access 函数。
    • 那么,请将您基本相同的解决方案添加到您的问题中。没错,CSql 不是 VBA 原生的,这就是它被编写的原因。
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多