Суть в том, что у меня в базе данных есть как даты, так и десятичные числа. Однако, при записывании в запрос числа с запятой он крашится с данным сообщением:
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)
Попытался поменять среду исполнения (или как оно там зовётся) с русской на английскую - меняется дата, и запрос выдаёт ошибку о нарушении соответствия данных. Уважаемые знатоки, спасите.
Как верно указали выше, лучше использовать параметризованные запросы. Однако, это не всегда возможно (например, когда запрос собирается по частям с учетом разных учловий - не только значения проверок, но и их наличие).
Для понимания сути проблемы, нужно понимать, каким образом данные преобразуются в текстовый вид. Выведите на печать значения, которые вызывают ошибки и проверьте их формат. MS Access очень привередлив в этом плане.
# не правильно
>>> 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;'
#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#;'
... используйте параметризованные запросы. Следующей у Вас вылезет ошибка с датой.
"через параметры" десятичный разделитель вообще не имеет значения. Конечно, если параметр - число, а не строка.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости