Доступ вставить числовое значение с десятичной запятой в Postgresql

Мне нужно вставить строку заказа в связанную таблицу PostgreQL, используя Access VBA. Для простоты отчетности я решил включить чистую цену, которая представляет собой числовое поле 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) & ");"

person Guido    schedule 01.11.2017    source источник
comment
Решением было бы использовать правильно параметризованный запрос вместо преобразования всего в строки и их конкатенации, т.е. передавать значения с плавающей запятой как таковые на сервер. При этом количество полей неверно, даже если ваши значения 216 и 0.8: вы указываете 2 значения для 5 полей.   -  person Mathieu Guindon    schedule 01.11.2017
comment
использовать параметры (подготовленный запрос). Это базовая защита для неамериканских приложений (числа, валюты, даты).   -  person Jacek Cz    schedule 01.11.2017
comment
@JacekCz это базовая защита для всего, что удаленно связано с SQL, в США или нет.   -  person Mathieu Guindon    schedule 01.11.2017
comment
Спасибо. Я посмотрю на параметризацию. Ошибка в количестве полей связана с тем, что я упростил запрос. Спасибо Мэту за добавленный комментарий.   -  person Guido    schedule 02.11.2017


Ответы (3)


Рассмотрите параметризацию SQL (отраслевой стандарт для любого оператора SQL, используемого в коде прикладного уровня, таком как VBA), помимо простой защиты от SQL-инъекций. И не только для Access или Postgres. Параметризация помогает избежать заключения в кавычки, экранирования специальных символов, объединения строк и указания типов данных для согласования с региональными настройками.

В MS Access вы можете использовать предложение PARAMETERS (допустимо в диалекте Access SQL) и привязывать значения в 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
person Parfait    schedule 01.11.2017
comment
Большое спасибо. Это то, что мне было нужно - person Guido; 02.11.2017
comment
Отдельное спасибо за отличный пример. Это действительно меня на пути. - person Guido; 02.11.2017
comment
Превосходно! Рад помочь. И обратите внимание на особый способ сказать спасибо на StackOverflow. - person Parfait; 02.11.2017


Это должно работать:

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