Проблема даже совсем непонятная. Вроде все правильно но выдает ошибку: Ошибка синтаксиса в инструкции 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
6642 gold badges13 silver badges30 bronze badges
asked Jan 7, 2011 at 16:13
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 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!)
answered Jan 7, 2011 at 17:28
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
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 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
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
CLARKCLARK
887 bronze badges
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();
}
Masquerade
11.05.15
✎
23:56
А где
dontedit = false; ???
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);
Masquerade
12.05.15
✎
00:00
Почему не так?
cl.date = «DateTime.Now.Year / DateTime.Now.Month / DateTime.Now.Day»;
Masquerade
12.05.15
✎
00:03
И я не думаю, что ты ты, переписав запрос правильно — получишь результат.
Поля в БД у тебя содержат в названии ID, а ты пытаешься запихнуть туда значения с формы. Сомнительно как-то что-то ты вводишь туда ID.
Отдельно порадовало:
Data Source=C:\DIPLOM\DATABASE\
Диплом значит…
Masquerade
12.05.15
✎
00:04
(0)
Удовлетвори любопытсво — для какого учебного заведения это.. Это печется?
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 и прочие в текстовом (индексы преобразованные в текст)
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);
???
avyub
12.05.15
✎
00:39
ну во первых я заочник, C# изучали пару дней. Сейчас самостоятельно осваиваю.
под разнице ты ведь не ‘ имеешь ввиду. Сейчас преобразоввываю некоторые переменные из string в int. Потом снова попробую выполнить запрос
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);
Masquerade
12.05.15
✎
00:41
(8)
— Сейчас самостоятельно осваиваю.
Так осваивай правильно, литературы полно. Ни в одной книге нет и не может быть такого кода.
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();
}
avyub
12.05.15
✎
00:57
на строке
Int16 dep=Convert.ToInt16(cl.department);
выдает ошибку
avyub
12.05.15
✎
00:59
(12)
cl.department имеет тип string
ID_Departmen имеет тип Числовой
avyub
12.05.15
✎
01:02
(12)
Входная строка имела неверный формат.
Супер король
12.05.15
✎
06:52
(0) В строке: …… values (cl.date,cl.time, ……….
вместо значений указаны имена переменных, да к тому же без кавычек.
должно быть так:
….. values (‘» . cl.date . «‘, ‘» . cl.time . «‘, …….
sql не понимает что такое cl.date, потому что оно стоит внутри строки ограниченной двойными кавычками и является частью строковой константы, а не переменной.
Serginio1
12.05.15
✎
10:37
15+ Лучше использовать параметры
Например
command.Parameters.AddWithValue(«@ID_Department», dep);
На худой конец String.Format
avyub
12.05.15
✎
11:32
(15)
т.е. каждую переменную поместить внутрь трех символов ‘». и .»‘
в одинарные кавычки пробовал помещать переменные еще до того как тему открыл
а для чего здесь точка?
а sql должен разве понимать, что такое cl.date и пр? Это все текстовые переменные. В файле акцессе в этом поле тоже должна
быть текстовая переменная. Я считал, что если MessageBox.Show(cl.date) выдает правильный результат, то с ними проблем нет.
Вот с полями типа числовой.. действительно пытаюсь тестовую переменную вставить в Числовое поле.
и все таки, почему не получается преобразовать Int16 dep=Convert.ToInt16(cl.department); что здесь неправильно?
avyub
12.05.15
✎
11:37
(16) а разве @ ставят не перед переменными, которые являются зарезервированными словами? или у него есть еще какое то значение?
Насчет command.Parameters.AddWithValue посмотрю что это такое и для чего
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
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ᵀᴹ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.
- create the table with them unquoted
- never quote them in your queries
- you can always use
$$ DOLLAR QUOTED STRING LITERALSto 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 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 и предложили некоторые рекомендации по их устранению. Отслеживая и исправляя такие ошибки, вы сможете улучшить качество вашего кода и избежать ненужных проблем при работе с базами данных.
