Имя: Пароль:
IT
 
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