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

Проблема даже совсем непонятная. Вроде все правильно но выдает ошибку: Ошибка синтаксиса в инструкции INSERT INTO.

(База на MS Access)

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password='';Data Source=myFirma.mdb");
OleDbCommand myData = new OleDbCommand("select * from Users", myConnection);
OleDbCommand myQuery = new OleDbCommand("insert into Users (name,surname,login,password,action)values('" + textBox1.Text + "', '" + textBox2.Text + "', '" + textBox3.Text + "', '" + textBox4.Text + "', '" + textBox5.Text + "')",myConnection);
myConnection.Open();
myQuery.ExecuteNonQuery();
myConnection.Close();

Попробовал другой вариант:

String myConn = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=myDataBase.mdb;";
String myQuery = "INSERT INTO Users ( name, surname, login, password, action) VALUES ('" + textBox1.Text + "', '" + textBox2.Text + "', '" + textBox3.Text + "', '" + textBox4.Text + "', '" + textBox5.Text + "')";
OleDbConnection cn = new OleDbConnection(myConn);
cn.Open();
OleDbCommand cmd = new OleDbCommand(myQuery, cn);
cmd.ExecuteNonQuery();
cn.Close();

Кроме этих пробовал еще варианты, обыскал весь Гугл, ниче не помогло. Все время одна и та же ошибка на одной и той же строчке:

.ExecuteNonQuery();

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

Последняя надежна на вас.

  • Перемещено

    1 октября 2010 г. 22:40
    MSDN Forums consolidation (От:Visual C#)

s1 = "INSERT INTO call_requests ([id_users], [id_call_request_types], [id_call_request_statuses], [id_user_contact_types], [id_countries], [contact_value], [contact_name], [time_start], [time_end], [call_request_note], [date_add], [id_user_sessions]) VALUES (" & IIf(id_users > 0, id_users, "NULL") & ", " & id_call_request_types & ", " & id_call_request_statuses & ", " & id_user_contact_types & ", " & id_countries & ", '" & contact_value & "', '" & Replace(contact_name, "'", Chr(34)) & "', " & Nz(time_start, "Null") & ", " & Nz(time_end, "Null") & ", '" & Nz(call_request_note, "") & "', " & DateWinToJet(date_add) & "," & IIf(id_user_sessions > 0, id_user_sessions, "Null") & ")"

Вот что выдает debug.print s1:

INSERT INTO [call_requests] ([id_users], [id_call_request_types], [id_call_request_statuses], [id_user_contact_types], [id_countries], [contact_value], [contact_name], [time_start], [time_end], [call_request_note], [date_add], [id_user_sessions]) VALUES (104696, 8, 1, 1, 170, '92458******', '', 0, 0, '', ,Null)

I keep getting an error when I attempt to insert values into a Access database.

The error is syntactic, which leads to the following exception:

OleDbException was unhandled Syntax error in INSERT INTO statement.

private OleDbConnection myCon;

public Form1()
{
    InitializeComponent();
    myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}

private void insertuser_Click(object sender, EventArgs e)
{
    OleDbCommand cmd = new OleDbCommand();
    myCon.Open();
    cmd.Connection = myCon;
    cmd.CommandType = CommandType.Text;

    cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
                                        "[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
                      "VALUES ('" + userid.Text.ToString() + "' , '" +
                                    fname.Text.ToString() + "' , '" +
                                    sname.Text.ToString() + "' , '" +
                                    dob.Text.ToString() + "' , '" +
                                    tarweight.Text.ToString() + "' , '" +
                                    tarcal.Text.ToString() + "' , '" +
                                    height.Text.ToString() + "')";

    cmd.ExecuteNonQuery();
    myCon.Close();
}

Shin's user avatar

Shin

6642 gold badges13 silver badges30 bronze badges

asked Jan 7, 2011 at 16:13

Howard's user avatar

4

Well, you haven’t specified what the error is — but your first problem is that you’re inserting the data directly into the SQL statement. Don’t do that. You’re inviting SQL injection attacks.

Use a parameterized SQL statement instead. Once you’ve done that, if you still have problems, edit this question with the new code and say what the error is. The new code is likely to be clearer already, as there won’t be a huge concatenation involved, easily hiding something like a mismatched bracket.

EDIT: As mentioned in comments, Jet/ACE is vulnerable to fewer types of SQL injection attack, as it doesn’t permit DML. For this INSERT statement there may actually be no vulnerability — but for a SELECT with a WHERE clause written in a similar way, user input could circumvent some of the protections of the WHERE clause. I would strongly advise you to use parameterized queries as a matter of course:

  • They mean you don’t have to escape user data
  • They keep the data separate from the code
  • You’ll have less to worry about if you ever move from Jet/ACE (whether moving this particular code, or just you personally starting to work on different databases)
  • For other data types such as dates, you don’t need to do any work to get the data into a form appropriate for the database

(You also don’t need all the calls to ToString. Not only would I expect that a property called Text is already a string, but the fact that you’re using string concatenation means that string conversions will happen automatically anyway.)

answered Jan 7, 2011 at 16:15

Jon Skeet's user avatar

Jon SkeetJon Skeet

1.4m873 gold badges9165 silver badges9215 bronze badges

13

I posted this as a comment to the duplicate question at: Syntax error in INSERT INTO statement in c# OleDb Exception cant spot the error

Put brackets [] around the table name
«User». It’s a reserved word in SQL
Server.

«User» is also a reserved word in Access (judging by the provider in your connection string).

But I completely agree with Jon—if you fix your current implementation, you are just opening up a big security hole (against your User table, no less!)

Community's user avatar

answered Jan 7, 2011 at 17:28

Tim M.'s user avatar

Tim M.Tim M.

53.8k14 gold badges121 silver badges163 bronze badges

This problem may occur if your database table contains column names that use Microsoft Jet 4.0 reserved words.

Change the column names in your database table so that you do not use Jet 4.0 reserved words.

answered Apr 23, 2014 at 11:43

user3183270's user avatar

1

If TargetWeight, Height, and TargetCalories are floating-point or integer values, they don’t need to be surrounded by quotes in the SQL statement.

Also, not directly related to your question, but you should really consider using a parameterized query. Your code is very vulnerable to SQL injection.

answered Jan 7, 2011 at 19:13

Brennan Vincent's user avatar

Brennan VincentBrennan Vincent

10.8k9 gold badges33 silver badges54 bronze badges

public decimal codes(string subs)
    {
        decimal a = 0;


        con_4code();
            query = "select SUBJINTN.[SCODE] from SUBJINTN where SUBJINTN.[ABBR] = '" +                         subs.ToString() + "'";
            cmd1 = new OleDbCommand(query, concode);
            OleDbDataReader dr = cmd1.ExecuteReader();

here is error in dr it says syntax error ehile in DBMS its working Well

            if (dr.Read())
            {
                a = dr.GetDecimal(0);
                MessageBox.Show(a.ToString());
            }
            return a;



    }

answered Mar 26, 2012 at 8:35

user1289578's user avatar

1

After this

cmd.CommandText="INSERT INTO User ([UserID], [Forename], [Surname], [DateOfBirth], [TargetWeight], [TargetCalories], [Height]) Values ('" + userid.Text.ToString() + "' , '" + fname.Text.ToString() + "' , '" + sname.Text.ToString() + "' , '" + dob.Text.ToString() + "' , '" + tarweight.Text.ToString() + "' , '" + tarcal.Text.ToString() + "' , '" + height.Text.ToString() + "')";

check what this contains, maybe [DateOfBirth] has illegal format

answered May 12, 2013 at 7:34

CLARK's user avatar

CLARKCLARK

887 bronze badges

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

This might be a little silly, but can’t figure out why this insert is not working, I did surround the IP with single / double quotes!

psql -U dbuser hosts -h dbhost -c 'INSERT INTO HOSTS ('type','name') VALUES ('"test"', '"10.100.133.1"')'
Password for user dbusr:
ERROR:  syntax error at or near ".133"
LINE 1: INSERT INTO HOSTS (type,name) VALUES (test, 10.100.133.1)
                                                          ^

Do I need to escape anything?

asked Oct 24, 2016 at 7:34

Deano's user avatar

2

This works fine:

postgres=# create table hosts ( type varchar(20), name varchar(20));
CREATE TABLE
postgres=# \q
postgres@ironforge:~$ psql -c "insert into hosts (type,name) values ('test','10.100.133.1')"
INSERT 0 1
postgres@ironforge:~$

answered Oct 24, 2016 at 8:00

Philᵀᴹ's user avatar

PhilᵀᴹPhilᵀᴹ

31.6k10 gold badges82 silver badges107 bronze badges

1

A couple of notes.

  • you never have to quote columns names (identifiers) and you never should quote them where it isn’t required.
    1. create the table with them unquoted
    2. never quote them in your queries
  • you can always use $$ DOLLAR QUOTED STRING LITERALS to get around shell quoting escaping.

So this should work,

psql -c 'INSERT INTO HOSTS (type,name) VALUES ($$test$$, $$10.100.133.1$$)'

answered Nov 23, 2016 at 18:21

Evan Carroll's user avatar

Evan CarrollEvan Carroll

62.1k46 gold badges233 silver badges470 bronze badges

3

Одним из наиболее распространенных видов ошибок, с которыми сталкиваются разработчики при использовании баз данных, являются ошибки синтаксиса. В этой статье мы рассмотрим одну из таких ошибок — «Ошибка синтаксиса в инструкции INSERT INTO» — и постараемся разобраться в причинах ее возникновения и способах ее устранения.

Инструкция INSERT INTO является одной из основных инструкций языка SQL, которая используется для добавления новых записей в таблицу базы данных. Ошибки синтаксиса в этой инструкции часто возникают из-за неверного формата или неправильного порядка аргументов. Давайте рассмотрим несколько примеров таких ошибок и возможные пути их решения.

Одна из частых ошибок связана с неверным написанием названия таблицы, в которую мы хотим добавить запись. Например, допустим у нас есть таблица «users», и мы хотим добавить нового пользователя. Правильный синтаксис для этого запроса выглядит следующим образом:

INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');

Однако, если мы случайно введем неправильное название таблицы, например, «user», мы получим ошибку синтаксиса. Поэтому перед вводом инструкции INSERT INTO всегда необходимо убедиться, что мы используем правильное название таблицы.

Еще одна распространенная ошибка связана с неверным форматом значений, которые мы пытаемся добавить в таблицу. Например, если в столбце таблицы, в который мы хотим вставить значение, указан числовой тип данных, а мы пытаемся добавить строковое значение, возникнет ошибка синтаксиса.

Мы должны убедиться, что значения соответствуют типам данных таблицы. Если у нас есть столбец с числовым типом данных, мы не должны пытаться добавить в него строковое значение. В этом случае синтаксический запрос будет выглядеть следующим образом:

INSERT INTO users (name, age) VALUES ('John Doe', 25);

Другой распространенной ошибкой является неправильный порядок аргументов при написании инструкции INSERT INTO. Синтаксический запрос должен соответствовать порядку столбцов таблицы. Если мы пытаемся указать значения в другом порядке, возникнет ошибка синтаксиса.

Например, предположим, что у нас есть таблица «users» с колонками «id», «name» и «email». Правильный синтаксис будет выглядеть следующим образом:

INSERT INTO users (id, name, email) VALUES (1, 'John Doe', '[email protected]');

Если же мы попытаемся указать значения в другом порядке, например, инструкцию INSERT INTO следующего вида:

INSERT INTO users (email, name, id) VALUES ('[email protected]', 'John Doe', 1);

То будет возникать ошибка синтаксиса, так как неправильный порядок столбцов не будет соответствовать определению таблицы.

Также следует учесть, что в некоторых случаях для некоторых столбцов таблицы могут быть определены ограничения (constraints), которые ограничивают допустимые значения. Если мы попытаемся добавить в таблицу значение, которое нарушает ограничение, возникнет ошибка синтаксиса. Например, если у нас есть ограничение на минимальное значение столбца, и мы попытаемся добавить значение меньше этого минимума, произойдет ошибка.

Для решения данной ошибки следует проверить ограничения таблицы и убедиться, что значение, которое мы пытаемся добавить, соответствует этим ограничениям.

Чтобы избежать ошибок синтаксиса в инструкции INSERT INTO, рекомендуется следовать следующим практикам:

— Всегда проверяйте правописание названия таблицы, столбцов и других объектов базы данных перед написанием инструкций.
— Проверьте типы и форматы значений, которые вы пытаетесь добавить, и убедитесь, что они соответствуют типам данных столбцов таблицы.
— Убедитесь, что порядок аргументов в инструкции INSERT INTO соответствует порядку столбцов в таблице.
— Проверьте существующие ограничения таблицы и убедитесь, что значения, которые вы пытаетесь добавить, соответствуют этим ограничениям.

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

Понравилась статья? Поделить с друзьями:

Это тоже интересно:

  • Очки вижн с дырочками инструкция по применению
  • Очки в сеточку для восстановления зрения инструкция
  • Очки в мелкую дырочку для чего инструкция
  • Очки vr box для телефона инструкция по применению
  • Очки 3д для телевизора самсунг инструкция по применению

  • Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии