Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 11

Ошибка в инструкции INSERT

02.05.2021, 18:22. Показов 2072. Ответов 8

Студворк — интернет-сервис помощи студентам
Добрый день. Есть datagridview, база данных с тремя таблицами. Таблица OrderItems содержит поля id - счетчик, orders_id - числове, prodname - текстовое, price - числовое double, count - числовое. При добавлении новых строк в datagridview делаю сохранение изменений в базу данных. При этом получаю ошибку "Ошибка синтаксиса в инструкции INSERT INTO" при выполнении запроса. Во всех переменных, используемых в запросе, значения есть. При выполнении INSERTa в самом ACCESSe все работает, а из приложения нет. В чем может быть проблема? Код следующий:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
try
                {
                    connect.Open();
                    
                    cmd.CommandText = String.Format("SELECT id FROM Orders WHERE dateoper='{0}' AND customer_id={1}", ordersDate, clientId);
                    orderId = Convert.ToInt32(cmd.ExecuteScalar());
 
                    String productName;
                    double productPrice;
                    int productCount;
                    for (int i = 0; i < DT.Rows.Count; i++)
                    {
                        DataRow row = DT.Rows[i];
                        if (row.RowState == DataRowState.Added)
                        {
                            productName = Convert.ToString(row[0]);
                            productPrice = Convert.ToDouble(row[1]);
                            productCount = Convert.ToInt32(row[2]);                            
                            cmd.CommandText = String.Format("INSERT INTO OrderItems(orders_id,prodname,price,count) VALUES('{0}','{1}','{2}','{3}')", orderId, productName, productPrice, productCount);
                            cmd.ExecuteNonQuery();
                        }
                    }
                    DT.AcceptChanges();
                    connect.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка сохранения заказа в базу " + ex.Message);
                }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2021, 18:22
Ответы с готовыми решениями:

Ошибка синтаксиса в инструкции INSERT INTO
private void button6_Click(object sender, EventArgs e) { OleDbConnection myOleDbConnection = new...

Ошибка синтаксиса в инструкции INSERT INTO
Всем привет, можно попросить помощи с доработкой запроса. string com = comboBox1.Text.Split(' '); int id =...

Ошибка синтаксиса инструкции INSERT INTO
Пишу свою курсовую работу, это интерфейс для БД ACCESS. Написала половину кода, везде работал следующий обработчик для добавления записи в...

8
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.05.2021, 19:43
C#
1
2
3
4
5
6
7
8
9
10
//    productName = Convert.ToString(row[0]);
//                            productPrice = Convert.ToDouble(row[1]);
//                            productCount = Convert.ToInt32(row[2]);                            
                            cmd.CommandText = String.Format("INSERT INTO OrderItems(orders_id,prodname,price,count) VALUES( 
                            @orderId, @productName, @productPrice, @productCount)";
                            cmd.Parameters.AddWithValue("@orderId",orderId);
                            cmd.Parameters.AddWithValue("@productName",Convert.ToString(row[0]);
                            cmd.Parameters.AddWithValue("@productPrice",Convert.ToDouble(row[1]);
                            cmd.Parameters.AddWithValue("@productCount",Convert.ToInt32(row[2]);
                            cmd.ExecuteNonQuery();
0
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 11
02.05.2021, 20:45  [ТС]
Спасибо за совет, попробовал с параметрами, но к сожалению ошибка та же
0
HF
 Аватар для HF
1317 / 896 / 200
Регистрация: 09.09.2011
Сообщений: 2,692
Записей в блоге: 2
02.05.2021, 20:52
Цитата Сообщение от kaidzen Посмотреть сообщение
При этом получаю ошибку "Ошибка синтаксиса в инструкции INSERT INTO" при выполнении запроса. Во всех переменных, используемых в запросе, значения есть. При выполнении INSERTa в самом ACCESSe все работает, а из приложения нет.
Скопируйте результат сбора строки запроса из 19ой строки и выполните в БД. Она не должна работать. И узнаете проблему.
0
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 11
02.05.2021, 21:10  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Скопируйте результат сбора строки запроса из 19ой строки и выполните в БД
Ввел данные в datagride, скопировал из отладчика полученную строку, строка получилась такая:
SQL
1
INSERT INTO OrderItems(orders_id,prodname,price,COUNT) VALUES('18','какойтотовар','155','10')
. Открыл базу, в базе запрос сработал без ошибок. Из кода нет
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.05.2021, 21:23
Лучший ответ Сообщение было отмечено kaidzen как решение

Решение

Слово count в запросе возьмите в квадратные скобки : [count]
Фишка в том, что в акцесе это слово не является зарезервированным, в для ADO.NET - является

Добавлено через 33 секунды
Не обратил внимания когда писал пост

Добавлено через 1 минуту
Впредь, называя поля таблиц БД зарезервированными словами, не забывайте в запросах брать их в квадратные (для access и MS SQL Server по крайней мере) скобки
1
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 11
02.05.2021, 21:51  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Слово count в запросе возьмите в квадратные скобки
Спасибо, все заработало. Про зарезервированное слово не знал, теперь учту
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.05.2021, 22:25
Зарезервированные слова TransactSQL (T-SQL)
https://docs.microsoft.com/ru-... rved-words

Отлаживайте запросы в SSMS, он, насколько я помню, вполне умеет работать с Access.
Это - гарантия того, что ADO.NET правильно поймет Ваш SQL и пошлет акцесу правильный запрос.

Работая с акцесом напрямую, вы "обходите" ADO.NET, но Ваше приложение будет взаимодействовать именно с адо и Вы будете получать грабли.

Добавлено через 17 минут
И еще совет "бывалого"
Создавая таблицы в БД и давая имена полям таблицы, используйте префиксы.
Например, есть три таблицы : Person, Departament, Position
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE Departament(
   DEP_Id INT IDENTITY(1,1) PRIMARY KEY,
   DEP_Name VARCHAR(MAX) NOT NULL,
   DEP_Address VARCHAR(MAX) NOT NULL
)
CREATE TABLE POSITION(
   POS_Id INT IDENTITY(1,1) PRIMARY KEY,
   POS_DEP_Id INT REFERENCES Departament(DEP_Id) NOT NULL,
   POS_Name VARCHAR(MAX) NOT NULL,
   POS_Salary DECIMAL(15,2) NOT NULL
)
CREATE TABLE Person (
   PERS_Id INT IDENTITY(1,1) PRIMARY KEY,
   PERS_POS_Id INT REFERENCES POSITION(POS_Id) NOT NULL,
   PERS_Family VARCHAR(MAX) NOT NULL,
   PERS_Name VARCHAR(MAX) NULL,
   PERS_SurName VARCHAR(MAX) NULL
)
Такая техника даст Вам несколько очень приятных преимуществ:
- Априори все имена полей не совпадут ни с одним из зарезервированных слов ни одного стандарта/диалекта SQL
- Удобство при написании запросов - пишете в SSMS (например) запрос к таблице, набираете префикс и Ctrl+<пробел> - получаете в выпадающем списке все имена полей только этой таблицы.
- Читабельность запросов - сразу видно, к какой таблице относится любое поле, например в списке выбираемых полей, в WHERE, GROUP BY, HAVING, ORDER BY и т.д.
1
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 11
03.05.2021, 09:19  [ТС]
Спасибо за ссылку и за совет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2021, 09:19
Помогаю со студенческими работами здесь

Ошибка синтаксиса в инструкции INSERT INTO
Здравствуйте. Пишу программу на C#, пытаюсь сделать форму для заполнения таблицы. При нажатии на кнопку введенные данные должны...

Ошибка синтаксиса в инструкции INSERT INTO.
public partial class Form4 : Form { DataGridView dgv; public Form4() { ...

Ошибка синтаксиса в инструкции insert into
Вроде всё правильно прописал, но всё равно ворчит. Хелп, где я мог неправильно составить запрос? myOleDbCommand.CommandText =...

Ошибка синтаксиса в инструкции INSERT INTO
Я уже неоднократно писал про БОЛЬШУЮ, просто ОГРОМНУЮ проблему при добавлении записей в БД. Сегодня я опять весь день боролся с этим....

Ошибка синтаксиса в инструкции INSERT INTO
OleDbDataAdapter thisAdapter = new OleDbDataAdapter(&quot;select * from Заказ&quot;, myCon); OleDbCommandBuilder thisBuilder = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru