|
C#: "Ошибка синтаксиса в инструкции INSERT INTO" | ☑ | ||
---|---|---|---|---|
0
avyub
11.05.15
✎
21:23
|
Не сохраняются данные из формы. Выдает ошибку.
Листинг: private void btnAdd_Click(object sender, EventArgs e) { string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DIPLOM\DATABASE\calldata.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
Masquerade
11.05.15
✎
23:56
|
А где
dontedit = false; ??? |
|||
2
Masquerade
11.05.15
✎
23:59
|
А вообще - по 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
Masquerade
12.05.15
✎
00:00
|
Почему не так?
cl.date = "DateTime.Now.Year / DateTime.Now.Month / DateTime.Now.Day"; |
|||
4
Masquerade
12.05.15
✎
00:03
|
И я не думаю, что ты ты, переписав запрос правильно - получишь результат.
Поля в БД у тебя содержат в названии ID, а ты пытаешься запихнуть туда значения с формы. Сомнительно как-то что-то ты вводишь туда ID. Отдельно порадовало: Data Source=C:\DIPLOM\DATABASE\ Диплом значит... |
|||
5
Masquerade
12.05.15
✎
00:04
|
(0)
Удовлетвори любопытсво - для какого учебного заведения это.. Это печется? |
|||
6
avyub
12.05.15
✎
00:25
|
MessageBox.Show(cl.date + " " + cl.time + cl.callOperator + cl.department + cl.model + cl.source + cl.nameSurname + cl.contact);
все правильно выдает. Насчет ID я тоже думал. Там числовой формат, а cl.callOperator и прочие в текстовом (индексы преобразованные в текст) |
|||
7
Masquerade
12.05.15
✎
00:29
|
(6)
Во первых - ты не ответил на (5). Во вторых - ты не видишь разницы между кодом в (6) и 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
avyub
12.05.15
✎
00:39
|
ну во первых я заочник, C# изучали пару дней. Сейчас самостоятельно осваиваю.
под разнице ты ведь не ' имеешь ввиду. Сейчас преобразоввываю некоторые переменные из string в int. Потом снова попробую выполнить запрос |
|||
9
Masquerade
12.05.15
✎
00:39
|
Короче, умного учить - только портить.
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
Masquerade
12.05.15
✎
00:41
|
(8)
-- Сейчас самостоятельно осваиваю. Так осваивай правильно, литературы полно. Ни в одной книге нет и не может быть такого кода. |
|||
11
avyub
12.05.15
✎
00:56
|
сейчас код выглядит так:
private void btnAdd_Click(object sender, EventArgs e) { string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DIPLOM\DATABASE\calldata.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
avyub
12.05.15
✎
00:57
|
на строке
Int16 dep=Convert.ToInt16(cl.department); выдает ошибку |
|||
13
avyub
12.05.15
✎
00:59
|
(12)
cl.department имеет тип string ID_Departmen имеет тип Числовой |
|||
14
avyub
12.05.15
✎
01:02
|
(12)
Входная строка имела неверный формат. |
|||
15
Супер король
12.05.15
✎
06:52
|
(0) В строке: ...... values (cl.date,cl.time, ..........
вместо значений указаны имена переменных, да к тому же без кавычек. должно быть так: ..... values ('" . cl.date . "', '" . cl.time . "', ....... sql не понимает что такое cl.date, потому что оно стоит внутри строки ограниченной двойными кавычками и является частью строковой константы, а не переменной. |
|||
16
Serginio1
12.05.15
✎
10:37
|
15+ Лучше использовать параметры
Например command.Parameters.AddWithValue("@ID_Department", dep); На худой конец String.Format |
|||
17
avyub
12.05.15
✎
11:32
|
(15)
т.е. каждую переменную поместить внутрь трех символов '". и ."' в одинарные кавычки пробовал помещать переменные еще до того как тему открыл а для чего здесь точка? а sql должен разве понимать, что такое cl.date и пр? Это все текстовые переменные. В файле акцессе в этом поле тоже должна быть текстовая переменная. Я считал, что если MessageBox.Show(cl.date) выдает правильный результат, то с ними проблем нет. Вот с полями типа числовой.. действительно пытаюсь тестовую переменную вставить в Числовое поле. и все таки, почему не получается преобразовать Int16 dep=Convert.ToInt16(cl.department); что здесь неправильно? |
|||
18
avyub
12.05.15
✎
11:37
|
(16) а разве @ ставят не перед переменными, которые являются зарезервированными словами? или у него есть еще какое то значение?
Насчет command.Parameters.AddWithValue посмотрю что это такое и для чего |
|||
19
Serginio1
12.05.15
✎
12:00
|
(18)
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) Внутри скобок можешь устанавливать нужный формат https://msdn.microsoft.com/ru-ru/library/system.string.format(v=vs.110).aspx |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |