Десятичные числа MS ACCESS C#

418
10 сентября 2021, 14:30

Суть в том, что у меня в базе данных есть как даты, так и десятичные числа. Однако, при записывании в запрос числа с запятой он крашится с данным сообщением:

System.Data.OleDb.OleDbException: "Не совпадает число значений запроса и число результирующих полей.

Запрос:

Order = new OleDbCommand("INSERT INTO Abiturients ( Institut_Code, Abiturient_Code, Lastname, Gender, Birthdate, Average_Score)" +            // SQL-запрос - вставить полученные
                " VALUES ('" + Icode + "', '" + Acode + "', '" + Lname + "', '"+ Gender +"', '"+ Bdate +"', "+ Average_Score +")", Connection);

Всё, соответственно, string, кроме Average_Score. Сам Average_Score получается из

Average_Score = double.Parse(textbox1.Text)

Попытался поменять среду исполнения (или как оно там зовётся) с русской на английскую - меняется дата, и запрос выдаёт ошибку о нарушении соответствия данных. Уважаемые знатоки, спасите.

Answer 1

Как верно указали выше, лучше использовать параметризованные запросы. Однако, это не всегда возможно (например, когда запрос собирается по частям с учетом разных учловий - не только значения проверок, но и их наличие).

Для понимания сути проблемы, нужно понимать, каким образом данные преобразуются в текстовый вид. Выведите на печать значения, которые вызывают ошибки и проверьте их формат. MS Access очень привередлив в этом плане.

  1. Числа с плавающей точкой должны иметь разделителем точку, а не запятую (в этом случае sql-движок считает, что переданы два целых числа, а не одно с плавающей точкой). (примеры на псевдокоде на основе python)
# не правильно
>>> sqlstr = 'SELECT * FROM tablename WHERE score = ' + str(score) + ';'
'SELECT * FROM tablename WHERE score = 12,3;'
# правильно
>>> str_score = str(score).replace(',', '.')
>>> sqlstr = 'SELECT * FROM tablename WHERE score = ' + str_score + ';'
'SELECT * FROM tablename WHERE score = 12.3;'
  1. Даты должны быть строго в формате USA-date, а именно #M/D/YYYY#. Отмечу, что разделитель должен быть именно /, а не точка или пробел. Порядок указания месяца и дня так же важны. Сперва указывается месяц, затем день. При этом числа должны быть в односимвольном формате (вместо 01-31 для дней и 01-12 для месяца должно быть указано 1-31 и 1-12 соответственно). Дата с обоих сторон заключается в решетку #.
# не правильно
>>> sqlstr = 'SELECT * FROM tablename WHERE bdate = ' + str(bdate) + ';'
'SELECT * FROM tablename WHERE bdate = 14.11.2019;'
# правильно
>>> d, m, y = splitdate(bdate)
>>> sqlstr = f'SELECT * FROM tablename WHERE bdate = #{m}/{d}/{y}#;'
'SELECT * FROM tablename WHERE bdate = #11/14/2019#;'
Answer 2

... используйте параметризованные запросы. Следующей у Вас вылезет ошибка с датой.

"через параметры" десятичный разделитель вообще не имеет значения. Конечно, если параметр - число, а не строка.

READ ALSO
Перегрузка оператора c#

Перегрузка оператора c#

Есть класс Stack(стек реализованный на основе массива)(поля: массив stackArr и счётчик count)В нём реализован метод Pop(извлечение элемента из стека)

142
Почему программа не выводит результат

Почему программа не выводит результат

такая проблема: нужна вывести Авто,вес прицепа которых больше 1500

141
Кастомный ProgresBar WPF

Кастомный ProgresBar WPF

Помогите сделать кастомный ProgressBar прочитал этот и этот пост дело в том, что мне нужен ProgressBar не совсем правильной(круглой) формы

105