C#: "Ошибка синтаксиса в инструкции INSERT INTO" #742387


#0 by avyub
Не сохраняются данные из формы. Выдает ошибку. Листинг:         private void btnAdd_Click(object sender, EventArgs e)         {             string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:DIPLOMDATABASEcalldata.accdb";             conn = new OleDbConnection(connString);             conn.Open;             Call cl;             dontedit = true; //для часов             cl.date = DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day;             cl.time = maskedTxtTime.Text;             cl.callOperator = myName;             cl.department = cmbDepartment.Text;             cl.model = cmbModel.Text;             cl.source = cmbSource.Text;             cl.nameSurname = txtClientName.Text;             cl.contact = txtClientTel.Text;             //MessageBox.Show(cl.date + " " + cl.time + cl.callOperator + cl.department + cl.model + cl.source + cl.nameSurname + cl.contact);             OleDbCommand c = new OleDbCommand("insert into Call (Date, Time, ID_Operator, ID_Department, ID_Model, ID_InfoSourse, ClientName, CotactTel) values (cl.date,cl.time,cl.callOperator,cl.department,cl.model,cl.source,cl.nameSurname',cl.contact)", conn);             c.ExecuteNonQuery;         }
#1 by Masquerade
А где dontedit = false; ???
#2 by Masquerade
А вообще - по 10-ти бальной шкале трешовости - это тянет на весь червонец. Почему в одном месте ты пишешь так: cl.date = DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day; А в другом так? OleDbCommand c = new OleDbCommand("insert into Call (Date, Time, ID_Operator, ID_Department, ID_Model, ID_InfoSourse, ClientName, CotactTel) values (cl.date,cl.time,cl.callOperator,cl.department,cl.model,cl.source,cl.nameSurname',cl.contact)", conn);
#3 by Masquerade
Почему не так? cl.date = "DateTime.Now.Year / DateTime.Now.Month  / DateTime.Now.Day";
#4 by Masquerade
И я не думаю, что ты ты, переписав запрос правильно - получишь результат. Поля в БД у тебя содержат в названии ID, а ты пытаешься запихнуть туда значения с формы. Сомнительно как-то что-то ты вводишь туда ID. Отдельно порадовало: Data Source=C:DIPLOMDATABASE Диплом значит...
#5 by Masquerade
Удовлетвори любопытсво - для какого учебного заведения это.. Это печется?
#6 by avyub
MessageBox.Show(cl.date + " " + cl.time + cl.callOperator + cl.department + cl.model + cl.source + cl.nameSurname + cl.contact); все правильно выдает. Насчет ID я тоже думал. Там числовой формат, а cl.callOperator и прочие в текстовом (индексы преобразованные в текст)
#7 by Masquerade
Во первых - ты не ответил на . Во вторых - ты не видишь разницы между кодом в и OleDbCommand c = new OleDbCommand("insert into Call (Date, Time, ID_Operator, ID_Department, ID_Model, ID_InfoSourse, ClientName, CotactTel) values (cl.date,cl.time,cl.callOperator,cl.department,cl.model,cl.source,cl.nameSurname',cl.contact)", conn); ???
#8 by avyub
ну во первых я заочник, C# изучали пару дней. Сейчас самостоятельно осваиваю. под разнице ты ведь не ' имеешь ввиду. Сейчас преобразоввываю некоторые переменные из string в int. Потом снова попробую выполнить запрос
#9 by Masquerade
Короче, умного учить - только портить. 1. cl.nameSurname' - что это за одинарная кавычка? 2. Ты не можешь писать так - var a = 1; var b = 2; OleDbCommand c = new OleDbCommand("insert into my_table(number1,number2) values (a,b)",conn); Это же бред. Кто подставит значения переменных? Надо либо использовать параметры, либо как-то так: OleDbCommand c = new OleDbCommand("insert into my_table(number1,number2) values ("+a+","+b+")",conn);
#10 by Masquerade
-- Сейчас самостоятельно осваиваю. Так осваивай правильно, литературы полно. Ни в одной книге нет  и не может быть такого кода.
#11 by avyub
сейчас код выглядит так:         private void btnAdd_Click(object sender, EventArgs e)         {             string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:DIPLOMDATABASEcalldata.accdb";             conn = new OleDbConnection(connString);             conn.Open;             Call cl;             dontedit = true; //для часов             cl.date = DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day;             cl.time = maskedTxtTime.Text;             cl.callOperator = myName;             Opr = 2;             //Int16 Opr=Convert.ToInt16(myName);             cl.department = cmbDepartment.Text;             Int16 dep=Convert.ToInt16(cl.department);             cl.model = cmbModel.Text;             Int16 mod = Convert.ToInt16(cl.model);             cl.source = cmbSource.Text;             Int16 src = Convert.ToInt16(cl.source);             cl.nameSurname = txtClientName.Text;             cl.contact = txtClientTel.Text;             //MessageBox.Show(cl.date + " " + cl.time + cl.callOperator + cl.department + cl.model + cl.source + cl.nameSurname + cl.contact);             OleDbCommand c = new OleDbCommand("insert into Call (Date, Time, ID_Operator, ID_Department, ID_Model, ID_InfoSourse, ClientName, ContactTel) values (cl.date,cl.time,opr,dep,mod,src,cl.nameSurname,cl.contact)", conn);             c.ExecuteNonQuery;         }
#12 by avyub
на строке Int16 dep=Convert.ToInt16(cl.department); выдает ошибку
#13 by avyub
cl.department имеет тип string ID_Departmen имеет тип Числовой
#14 by avyub
Входная строка имела неверный формат.
#15 by Супер король
В строке: ...... values (cl.date,cl.time, .......... вместо значений указаны имена переменных, да к тому же без кавычек. должно быть так: ..... values ('" . cl.date . "', '" . cl.time . "', ....... sql не понимает что такое cl.date, потому что оно стоит внутри строки ограниченной двойными кавычками и является частью строковой константы, а не переменной.
#16 by Serginio1
15+ Лучше использовать параметры Например command.Parameters.AddWithValue("@ID_Department", dep); На худой конец String.Format
#17 by avyub
т.е. каждую переменную поместить внутрь трех символов '". и ."' в одинарные кавычки пробовал помещать переменные еще до того как тему открыл а для чего здесь точка? а sql должен разве понимать, что такое cl.date и пр? Это все текстовые переменные. В файле акцессе в этом поле тоже должна быть текстовая переменная. Я считал, что если MessageBox.Show(cl.date) выдает правильный результат, то с ними проблем нет. Вот с полями типа числовой.. действительно пытаюсь тестовую переменную вставить в Числовое поле. и все таки, почему не получается преобразовать Int16 dep=Convert.ToInt16(cl.department); что здесь неправильно?
#18 by avyub
а разве @ ставят не перед переменными, которые являются зарезервированными словами? или у него есть еще какое то значение? Насчет command.Parameters.AddWithValue посмотрю что это такое и для чего
#19 by Serginio1
OleDbCommand c = new OleDbCommand("insert into Call (Date, Time, ID_Operator, ID_Department, ID_Model, ID_InfoSourse, ClientName, ContactTel) values (@Date, @Time, @ID_Operator, @ID_Department, @ID_Model, @ID_InfoSourse, @ClientName, @ContactTel)", conn); И для каждого парамера command.Parameters.AddWithValue Это самый правильный вариант. Второй вариант String.Format(("insert into Call (Date, Time, ID_Operator, ID_Department, ID_Model, ID_InfoSourse, ClientName, ContactTel) values ({0},{1},{2},{3},{4},{5},{6},{7})",cl.date,cl.time,opr,dep,mod,src,cl.nameSurname,cl.contact) Внутри скобок можешь устанавливать нужный формат
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С